gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:46:37 27 4
gpt4 key购买 nike

我想在导航菜单中突出显示当前页面。显然,当您在菜单链接的页面上时,我需要为菜单链接提供一个类似“事件”的类。这是一个经典问题,我见过很多解决方案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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com