获取当前网址

1 投票
4 回答
979 浏览
提问于 2025-04-16 02:35

我有几个视图,它们都在使用同一个模板。而这个模板里面有一些{% url %}标签,这些标签需要根据当前的视图指向不同的位置。有没有什么上下文变量可以告诉我当前视图的名字(比如view-1、view-2),这样我就可以在模板里这样使用:

{% url url-name %}

当然,也可以把额外的信息传递给模板,这样我就能知道当前调用的是哪个视图。不过我觉得这样做可能不太优雅。

4 个回答

1

我觉得在Django里没有直接的方法可以查看哪个视图渲染了当前的模板。所以,要么你得写一个上下文处理器(这会让事情变得更复杂,而不是简单),要么就从视图里发送信息。

但是,既然要把视图名称发送到模板,然后根据这个视图做其他操作,为什么不试试从每个视图发送构建好的网址呢?在视图里做决策逻辑要比在Django模板里高效得多。这只是一个建议。

祝编码愉快。

2

把请求的上下文信息传递给模板渲染器,并自己写一个上下文处理器,从请求中重建出网址。

http://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext

1

你也可以给模板传递额外的信息,这样我就能知道哪个视图被调用了。不过我觉得这不是个优雅的解决方案。

当然可以。这里有个例子:

def view1(request, form_class=MyForm, template_name='myapp/page.html'):
    # app code here
    this_url = reverse('view1')
    render_to_response(template_name, locals(), RequestContext(request))

def view2(request, form_class=MyForm, template_name='myapp/page.html'):
    # app code here
    this_url = reverse('view2')
    render_to_response(template_name, locals(), RequestContext(request))

myapp/page.html:

<a href="{{ this_url }}">Webpage</a>

你还可以创建一个自己的网址标签,比如叫做dynurl,它的第一个参数可以作为变量,而不是视图名称:

def view2(request, form_class=MyForm, template_name='myapp/page2.html'):
    # app code here
    this_view = 'view2'
    render_to_response(template_name, locals(), RequestContext(request))

myapp/page.html:

{% load dynurl_tags %}
<a href="{% dynurl this_view %}">Webpage</a>

不过你并没有详细解释为什么想要链接到当前视图。是为了链接到同一页面吗?有几种方法可以做到这一点:

<a href="">technically this points back to the same page</a>
<a href="{{ request.path }}">this url is the full path before the query string</a>
<a href="{{ request.get_full_path }}">this url is the full path plus the query string</a>

我觉得可以考虑一下这两个视图之间的主要区别,然后想出一个描述它们差异的变量。接着在模板中使用这个变量来确定新的网址。

对于更复杂的问题,你可能想看看Pinax groups以及它们是如何实现{% groupurl %}标签的。基本上,它允许你复制一个应用的所有网址,并传入一个“组”变量,用于创建基于组的特殊网址反向查找。

撰写回答