我想突出显示导航菜单中的当前页面。显然,当你在他们的页面上时,我需要给菜单链接一个类似'active'的类。这是一个经典问题,我见过很多解决方案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>
标记会显示您当前的请求和网址表达式,如果您当前在此页面上,则会返回“有效”。或者,这可以使用命名视图而不是网址来完成,但原则是相同的。
我的主要问题是我的导航将在99%的视图中被调用,然而,为了获取当前请求变量,我仍然使用类似这样的内容解析RequestContext:
def contact(request):
# snip ...
return render_to_response(
'contact.html',
{ 'myvar' : myvar },
context_instance=RequestContext(request))
为什么我需要将这个context_instance行添加到我的每个视图中,除非其中一个需要需要请求变量,以便获取当前的url / view以突出显示活动链接?这看起来非常潮湿,特别是对于必须在大多数django网站中的功能。我希望默认情况下包含请求,并且可以选择禁止它。我找不到在中间件中执行此操作的方法,因为在视图返回后,我无法在模板呈现之前拦截模板。
有什么建议吗?
答案 0 :(得分:16)
你的意图是有道理的,大多数时候你需要RequestContext
,而且由于性能原因,很少能安全地省略它。解决方案很简单,而不是render_to_response
使用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 })
来自django-annoying的 ...或render_to
装饰者:
from annoying.decorators import render_to
@render_to('template.html')
def foo(request):
bar = Bar.object.all()
return {'bar': bar}
答案 1 :(得分:1)
您不一定要对导航的标记做任何事情,以使当前的标记具有不同的样式 - 有使用CSS的声明性方法。
请在此处查看我的答案:Django: Is there a better way to bold the current page link以获取示例。
答案 2 :(得分:0)
为了将来参考,可以使用django-tabs来做OP想要的事情。