django - 为什么我必须在所有响应中传递 RequestContext?

标签 django django-templates navigation django-views requestcontext

我想在导航菜单中突出显示当前页面。显然,当您在菜单链接的页面上时,我需要为菜单链接提供一个类似“事件”的类。这是一个经典问题,我见过很多解决方案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 表达式,如果您当前位于此页面,则返回“事件”。或者,这可以使用命名 View 而不是 url 来完成,但原理是相同的。

我的主要问题是我的导航将在 99% 的 View 上调用,但是,为了获取当前的请求变量,我仍然需要将 RequestContext 解析为模板,如下所示:

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

为什么我需要将这个 context_instance 行添加到我的每一个 View 中,因为可能除了其中一个 View 之外的所有 View 都需要请求变量才能获取当前的 url/ View 以突出显示事件的关联?这看起来非常潮湿,尤其是对于大多数 django 站点中必须存在的功能而言。我希望默认情况下包含该请求,并且能够选择抑制它。我找不到在中间件中执行此操作的方法,因为我无法在 View 返回模板后渲染模板之前拦截模板。

有什么建议吗?

最佳答案

您的意图是有道理的,大多数时候您都需要 RequestContext ,并且只有极少数情况下出于性能原因才可以安全地省略它。解决方案很简单,使用 direct_to_template 快捷方式代替 render_to_response:

from django.views.generic.simple import direct_to_template

def contact(request):
    # snip ...
    return direct_to_template(request, 'contact.html', { 'myvar' : myvar })

... 或来自 django-annoyingrender_to 装饰器:

from annoying.decorators import render_to

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

关于django - 为什么我必须在所有响应中传递 RequestContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1052317/

相关文章:

css - 如何使用响应式网格系统将我的 Logo 置于导航中心?

jquery 导航,css 定位

python - 是否可以在 Django 模板语言中定位 html 元素的值?

python - Django 项目 - 某些网址上的错误请求 (400)

django - TypeError 对象不可迭代

python - Django - 模板上下文处理器 - 破坏我的应用程序

python - Django:在循环中保存查询集项是否有效?

django - protonmail.com 邮件服务的 EMAIL_PORT 是什么?

django - 无效的 block 标记 : 'render_field' , 应为 'empty' 或 'endfor' 。您是否忘记注册或加载此标签?

javascript - 仅显示最接近的列表元素