Django 究竟为什么我必须在所有的回答中传递上下文?

Django 究竟为什么我必须在所有的回答中传递上下文?,django,django-templates,navigation,django-views,requestcontext,Django,Django Templates,Navigation,Django Views,Requestcontext,我想突出显示导航菜单中的当前页面。显然,当你在菜单链接的页面上时,我需要给它们一个类似“active”的类。这是一个典型的问题,我见过很多解决方案。我的问题是我讨厌所有的人,认为他们都不干。例如: @register.simple_tag def active(request, pattern): import re if re.search(pattern, request.path): return 'active' return '' ----

我想突出显示导航菜单中的当前页面。显然,当你在菜单链接的页面上时,我需要给它们一个类似“active”的类。这是一个典型的问题,我见过很多解决方案。我的问题是我讨厌所有的人,认为他们都不干。例如:

@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>
当除了一个视图之外的所有视图都需要request变量以获取当前url/视图以突出显示活动链接时,为什么我需要将此context_实例行添加到每个视图中?这看起来非常潮湿,尤其是对于绝大多数django站点必须具备的功能而言。我希望在默认情况下包含请求,并且能够选择性地抑制它。我找不到在中间件中实现这一点的方法,因为我无法在视图返回模板之前拦截模板


有什么建议吗?

您不必对导航的标记做任何修改,就可以为当前导航提供不同的样式-使用CSS可以通过声明方式实现这一点


请参见我的回答:例如。

您的意图是有意义的,您在大多数情况下都需要
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 })
。。。或
从以下位置渲染到
装饰器:


作为将来的参考,您可以使用它来做OP想要做的事情。

用body id命名页面是一个好主意,但是body标签以及导航都在一个基本模板中。我可以将它屏蔽,并将{%block body_id%}我的页面{%endblock%}添加到每个扩展模板中,但是,干什么呢?有没有办法让这一切自动化?我想使用命名视图作为主体id,或者对其进行slugify或其他操作,而不必显式命名,并且必须为每个视图保留两个单独的“名称”:一个用于视图本身,一个用于css id。我的Django fu已经生锈了,但与其更改每个扩展模板,不如从contact()传入css名称和family:def contact(请求):render_to_response('contact.html',{'cssClass':'contact page','myvar':myvar},…)?还没有完全干透,但还不错。@render_to decorator真是太棒了!谢谢+1推荐@render_至!请注意,由于4年后的不活动,该模板已被接管和移动,Django 1.5已删除“direct_to_模板”。不使用django,现在推荐的方法是什么
from django.views.generic.simple import direct_to_template

def contact(request):
    # snip ...
    return direct_to_template(request, 'contact.html', { 'myvar' : myvar })
from annoying.decorators import render_to

@render_to('template.html')
def foo(request):          
    bar = Bar.object.all()  
    return {'bar': bar}