是否有任何解决方案可以设置所有模板中的某些变量,而无需在每个视图中设置参数?
例如,如果我登录系统,var = 1,所有模板都可以使用var值。
答案 0 :(得分:5)
(预注意:即使您不需要全球数据YET,也始终使用这些RequestContext
是一个好习惯,因为您永远不知道在更改时您是否需要全局数据后来)。
从视图中返回时,使用Template Context Processor并对每个模板使用RequestContext
。当您在视图中发送RequestContext(请求)作为模板的上下文时,它们将为每个已注册的上下文处理器提供所有数据。
e.g。考虑这个观点:
def some_view(request):
# ...
c = RequestContext(request, {
'foo': 'bar',
}, [ip_address_processor])
return HttpResponse(t.render(c)) #or use render_to_resonse('yourtemplate', c)
如果你有一个上下文处理器,如:
def foos(request):
return {'var': 1} #this is the data this CP provides to each of your requests.
#yes, data must be a dict-like object.
在每个请求中,您将使用RequestContext(request)在每个模板中将var
作为变量。你的上一个。视图将同时具有foo
和var
个变量(传递类似dict的参数,因为RequestContext的第二个参数就像将该值直接传递给render方法或render_to_response快捷方式函数;使用RequestContext(请求,数据)让您享受上下文处理器提供的所有数据。
如果您使用Django的基于类的视图或render()
快捷方式(而不是render_to_response
快捷方式),RequestContext
实例将自动用作上下文。
请记住,您必须APPEND到默认值,而不是覆盖元组。 e.g:
TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"path.to.foos")
你的settings.py文件中的(除了最后一个,都是django 1.5中使用的默认上下文处理器)。 否则你将失去django核心或许多软件包所需的大部分CP (是的,恕我直言,这是一个丑陋的警告,但如果你覆盖,你必须指定默认的那些)