Django中的全局模板参数

Mar*_*ssa 0 django templates global global-variables

是否有任何解决方案可以设置所有模板中的某些变量,而无需在每个视图中设置参数?

例如,如果我登录系统,则var = 1,并且所有模板都可以使用var值.

Lui*_*lli 5

(预注意: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)作为变量.你的上一个.视图将有两个foovar变量可用(传递类似于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)