Mar*_*ssa 0 django templates global global-variables
是否有任何解决方案可以设置所有模板中的某些变量,而无需在每个视图中设置参数?
例如,如果我登录系统,则var = 1,并且所有模板都可以使用var值.
(预注意:RequestContext即使您不需要全局数据YET,也始终使用这些是一个好习惯,因为您永远不知道在更改后,您是否需要以后使用全局数据).
使用模板上下文处理器,并RequestContext在从视图返回时为每个模板使用s.当您在视图中发送RequestContext(请求)作为模板的上下文时,它们将为每个已注册的Context Processor提供所有数据.
例如,考虑这个观点:
def some_view(request):
# ...
c = RequestContext(request, {
'foo': 'bar',
}, [ip_address_processor])
return HttpResponse(t.render(c)) #or use render_to_resonse('yourtemplate', c)
Run Code Online (Sandbox Code Playgroud)
如果你有一个上下文处理器,如:
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.
Run Code Online (Sandbox Code Playgroud)
您将var在每个请求中使用RequestContext(request)作为变量.你的上一个.视图将有两个foo和var变量可用(传递类似于dict的参数作为RequestContext的第二个参数就像将该值直接传递给render方法或render_to_response快捷方式函数;使用RequestContext(请求,数据)让您享受所有数据由您的上下文处理器提供).
如果您使用Django的基于类的视图或render()快捷方式(而不是render_to_response快捷方式),则RequestContext实例将自动用作上下文.
请记住,您必须APPEND到默认值,而不是覆盖元组.例如:
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")
Run Code Online (Sandbox Code Playgroud)
在您的settings.py文件中(除了最后一个,都是django 1.5中使用的默认上下文处理器).否则你将失去django核心或许多软件包所需的大部分CP(是的,恕我直言,这是一个丑陋的警告,但如果你覆盖,你必须指定默认的CP)