浅谈Django中的RequestContext和Context

来源:互联网 发布:淘宝超市网址 编辑:程序博客网 时间:2024/05/16 12:14

分别对应的包是:django.template.Context和django.template.RequestContext.

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

django/template/context.pydef 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中直接来使用。


0 1