为什么地球上我必须要通过的RequestContext在我所有的反应?(Why on earth d

2019-06-24 06:57发布

我想强调在导航菜单中的当前页面。 很显然,我需要给菜单链接,如“主动”的一类,当你自己的页面上。 这是一个经典的问题,我见过许多解决方案建议 。 我的问题是我讨厌所有的人,并考虑他们都不是非常干燥。 例如:

@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表达式返回“积极的”,如果你当前访问此页面。 或者这可以通过命名视图,而不是网址来完成,但原理是一样的。

我的这个主要问题是,我的导航将在我的意见99%,被称为然而,为了得到当前请求的变量还是有解析的RequestContext与这样的模板:

def contact(request):
    # snip ...
    return render_to_response(
                'contact.html',
                { 'myvar' : myvar },
                context_instance=RequestContext(request))

为什么我需要这个context_instance行添加到时候恐怕所有,但其中一人需要 ,以获得当前URL /视图突出活动链接的请求变量自己的看法每一个? 这似乎非常潮湿,特别是对于一个功能,必须是在绝大多数Django的网站。 我想在默认情况下被列入该请求,并能选择性地抑制它。 我不能找到一种方法,在中间件做到这一点,因为我不能前拦截模板及其渲染视图返回之后它。

有什么建议?

Answer 1:

你的目的是有道理的,你需要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 })

...或render_to从装饰Django的烦人 :

from annoying.decorators import render_to

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


Answer 2:

你不必做任何事情来导航的标记给当前的一个不同的风格 - 有声明的方式来做到这一点使用CSS。

看到这里我的答案: Django的:是否有大胆的当前页面链接一个更好的方式的一个例子。



Answer 3:

对于未来的参考,可以使用Django的标签做什么OP想要的。



文章来源: Why on earth do I have to pass RequestContext in all of my responses?