2013-03-21 80 views
1

有什么办法将变量传递给所有模板?例如我有一个包含Django将默认值视为模板

render_to_response('page.html', dictionary, \ 
context_instance = RequestContext(request)) 

的图,我想给另一个变量传递给模板文件是不在字典中。

目的是什么?假设我在所有视图(几百个视图)中都需要这个变量,并且我希望将这个变量传递给模板文件而不用接触字典。顺便说一下这个变量是一个函数的结果,它有一个参数(request)。

它可行吗?

回答

6

你会想写一个自定义context processor

上下文处理器有一个非常简单的接口:这只是一个Python函数,它接受一个参数,一个HttpRequest对象,并返回被添加到模板上下文的字典。每个上下文处理器必须返回一个字典。

自定义上下文处理器可以位于您的代码库中的任何位置。 Django所关心的是您的自定义上下文处理器是由您的TEMPLATE_CONTEXT_PROCESSORS设置指向的。

例如为:

# in project/context_processors.py 
def add_extra_variable(request): 
    return {'extra': myfunction(request)} 

# in settings.py: 
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", 
    "project.context_processors.add_extra_variable" 
) 

 

P.S:如果您使用的render代替render_to_response,你并不需要通过RequestContext

render('page.html', dictionary) 
+0

嗨,这看起来非常简单和好,但我已经在settings.py默认设置,而'TEMPLATE_CONTEXT_PROCESSORS + =(‘project.context_processors.add_extra_variable’,)'行打破它,因为它不存在。如果我只是简单地等于它,那么它会错过其他的东西,比如'django.contrib.auth.context_processors.auth'。任何想法我怎么能解决它? – user2194805 2013-03-21 12:30:54

+0

全写(编辑我的答案)。 (或者'from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS')。 – 2013-03-21 12:32:45

+0

哦,它完美的工作。非常感谢 :- )。 – user2194805 2013-03-21 12:48:01