获取当前网址
我有几个视图,它们都在使用同一个模板。而这个模板里面有一些{% url %}标签,这些标签需要根据当前的视图指向不同的位置。有没有什么上下文变量可以告诉我当前视图的名字(比如view-1、view-2),这样我就可以在模板里这样使用:
{% url url-name %}
当然,也可以把额外的信息传递给模板,这样我就能知道当前调用的是哪个视图。不过我觉得这样做可能不太优雅。
4 个回答
我觉得在Django里没有直接的方法可以查看哪个视图渲染了当前的模板。所以,要么你得写一个上下文处理器(这会让事情变得更复杂,而不是简单),要么就从视图里发送信息。
但是,既然要把视图名称发送到模板,然后根据这个视图做其他操作,为什么不试试从每个视图发送构建好的网址呢?在视图里做决策逻辑要比在Django模板里高效得多。这只是一个建议。
祝编码愉快。
把请求的上下文信息传递给模板渲染器,并自己写一个上下文处理器,从请求中重建出网址。
http://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext
你也可以给模板传递额外的信息,这样我就能知道哪个视图被调用了。不过我觉得这不是个优雅的解决方案。
当然可以。这里有个例子:
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 %}
标签的。基本上,它允许你复制一个应用的所有网址,并传入一个“组”变量,用于创建基于组的特殊网址反向查找。