您的位置:首页 > 产品设计 > UI/UE

浅谈Django中的RequestContext和Context

2013-12-30 17:00 537 查看
分别对应的包是:django.template.Context和django.template.RequestContext.

1.RequestContext在初始化的时候比Context多带了一个参数request,查阅源码可以知道request是为context processor准备的。

django/template/context.py
def get_standard_processors():
from django.conf import settings
global _standard_context_processors
if _standard_context_processors is None:
processors = []
collect = []
collect.extend(_builtin_context_processors)
collect.extend(settings.TEMPLATE_CONTEXT_PROCESSORS)
执行这些context processor,更新RequestContext,再render给模板:

class RequestContext(Context):
def __init__(self, request, dict=None, processors=None, current_app=None, use_l10n=None):
Context.__init__(self, dict, current_app=current_app, use_l10n=use_l10n)
if processors is None:
processors = ()
else:
processors = tuple(processors)
for processor in get_standard_processors() + processors:
self.update(processor(request))


2.从RequestContext的构造函数可以看出,我们可以通过processors参数传递context processor,这样我们可以灵活使用context processor。如果希望作用于所有的view,那么则可以在settings的TEMPLATE_CONTEXT_PROCESSORS设置,如果希望作用于特定的view,则可以在初始化一个RequestContext的时候,赋值给processors。同时,该参数是可选的,是一个包含context处理器参数的列表或者元组。

3.在使用render_to_response,render_to_string等shortcut的时候,可以附带context_instance参数来使用RequestContext:

def some_view(request):
# ... return render_to_response('my_template.html',
my_data_dictionary, context_instance=RequestContext(request))
或者

def view(request):
#...
return render_to_response('template1.html',
{'message':'I am the view.'},
context_instance=RequestContext(request,processors=[custom_proc]))
其中custom_proc为自定义变量的视图,当然也可以在TEMPLATE_CONEXT_PROCESSORS中直接定义一个可调用的函数元组,然后在processors中直接来使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: