我想在导航菜单中突出显示当前页面。显然,当您在菜单链接的页面上时,我需要为菜单链接提供一个类似“活动”的类。这是一个经典问题,我见过很多解决方案proposed。我的问题是我讨厌他们所有人,并且认为他们都不是很干。例如:
@register.simple_tag
def active(request, pattern):
import re
if re.search(pattern, request.path):
return 'active'
return ''
----
{% load tags %}
<div id="navigation">
<a class="{% active request "^/about/" %}" href="/about/">About</a>
<a class="{% active request "^/contact/" %}" href="/contact/">Contact</a>
<a class="{% active request "^/services/" %}" href="/services/">Services</a>
</div>
该标记接受您当前的请求和 URL 表达式,如果您当前位于此页面,则返回“活动”。或者,这可以使用命名视图而不是 url 来完成,但原理是相同的。
我的主要问题是,我的导航将在 99% 的视图上调用,但是,为了获取当前的请求变量,我仍然需要将 RequestContext 解析为模板,如下所示:
def contact(request):
# snip ...
return render_to_response(
'contact.html',
{ 'myvar' : myvar },
context_instance=RequestContext(request))
为什么我需要将此 context_instance 行添加到我的每一个视图中,而可能除了其中一个视图之外的所有视图中needsrequest 变量以便获取当前 url/视图以突出显示活动链接?这看起来非常潮湿,尤其是对于大多数 django 站点中必须存在的功能而言。我希望默认情况下包含该请求,并且能够选择抑制它。我找不到在中间件中执行此操作的方法,因为我无法在视图返回模板后渲染模板之前拦截模板。
有什么建议么?
你的意图是有道理的,你需要RequestContext
大多数情况下,出于性能原因,只有极少数情况下可以安全地省略它。解决方案很简单,而不是render_to_response
use direct_to_template
捷径:
from django.views.generic.simple import direct_to_template
def contact(request):
# snip ...
return direct_to_template(request, 'contact.html', { 'myvar' : myvar })
... or render_to
装饰器来自django-烦人的:
from annoying.decorators import render_to
@render_to('template.html')
def foo(request):
bar = Bar.object.all()
return {'bar': bar}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)