Django中的全局模板参数

时间:2014-03-26 22:29:56

标签: django templates global-variables global

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

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

1 个答案:

答案 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作为变量。你的上一个。视图将同时具有foovar个变量(传递类似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 (是的,恕我直言,这是一个丑陋的警告,但如果你覆盖,你必须指定默认的那些)