最近项目中遇到一个问题:
有一个base.html,前台页面基本都会extends这个base.html
base.html页面内有两个变量,需要views传入。要是有个几百个继承base.html的页面,每个页面需要一个views,那得是都大的工作量。
上下文变量不错:
RequestContext
class RequestContext(Context):
"""
This subclass of template.Context automatically populates itself using
the processors defined in TEMPLATE_CONTEXT_PROCESSORS.
Additional processors can be specified as a list of callables
using the "processors" keyword argument.
"""
def __init__(self, request, dict_=None, processors=None, current_app=None,
use_l10n=None, use_tz=None):
Context.__init__(self, dict_, current_app=current_app,
use_l10n=use_l10n, use_tz=use_tz)
if processors is None:
processors = ()
else:
processors = tuple(processors)
for processor in get_standard_processors() + processors:
self.update(processor(request))
RequestContext继承了Context,扩展了Context,最主要的就是红色的那两句,
get_standard_processors()
通过查看方法可以知道是获取在settings文件中 每个要被执行的处理器函数
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.request",
"django.core.context_processors.media",
)
一个请求进来时的过程 url 找到 对应的views, return (上下文变量就是在返回时对request做了一些事,主要就是返回一个字典,类似于return {
'user': user,
'perms': PermWrapper(user),
}
然后我们在模板就是可以使用返回来的值了),
方法一:只要我们在settings中TEMPLATE_CONTEXT_PROCESSORS定义了一个处理器,那我们使用RequestContext就不需要重复定义每个页面都需要的变量了。缺点就是每个views都使用了定义的处理器,如果不想让每个views都被处理那?
方法二:如果不是很多页面公用变量,而只有一部分,只针对指定的views使用指定的处理器
return render_to_response(template_name,extra_context,context_instance=RequestContext(request,processors=[xxxxx]))
原理就是for processor in get_standard_processors() + processors:
self.update(processor(request))
在获取了一开始初始settings设置的processor,同时也加入了我们自定义的一个处理器,这样我们针对想要使用处理器的views单独指定。