学习nitrate的源码时,在它的template里面看到很多参数能够自动传入模板内,估计是context processor的效果,所以现在来整体学习一下context processor。
在百度上搜索了以下文章,先看一下:http://www.cnblogs.com/btchenguang/archive/2012/09/01/2666763.html
这篇讲的是template的高阶用法,里面就有提到context processor
文章第一节复习了template的用法,没有问题,这个懂,无法就是一些模板函数以及变量的引用,就像文中说的,view.py使用模板的时候,是需要创建类似字典的context对象用作传参,譬如代码里面的done、nowtime都是需要传参的。
复习一下模板语言的用法
{# 模板tag的用法 #}
{% if done %}
Over
{% else %}
wait
{% endif %}
{# 模板变量的用法 #}
Now is { { nowtime }}
在views.py中使用模板的时候:
1. 通过模板名,获得模板对象
2. 创建context对象,类似字典,用于像模板提供变量实际的值
3. 使用context对象进行模板的渲染,返回的是html网页的内容
文章然后介绍了使用requestcontext对上下文内容进行重用的方法,看了前面的介绍,对重用的概念不理解,继续往下看例子
使用RequestContext对上下文内容进行重用
当渲染一个模板的时候,我们通常使用的是django.template.Context的对象,
这里要介绍另外一个它的子类,django.template.RequestContext,
RequestContext提供了一种把不同的context内容中公共的部分提取出来的方法,
让context的内容重用。例子1. Context版
from django.template import loader, Context
from django.http import HttpResponse
def view_1(request):
t = loader.get_template('template1.html')
c = Context({
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR'],
'message': 'I am view 1.'
})
return HttpResponse(t.render(c))
def view_2(request):
# ...
t = loader.get_template('template2.html')
c = Context({
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR'],
'message': 'I am the second view.'
})
return HttpResponse(t.render(c))
这个例子能够理解,就是import context对象后,然后定义一个自己的context对象c,然后给c定义一些字典参数,如app、user、message等。然后文中最后一句话说两个view的context对象有些context内容是重复的,也就是说想将所有context内容打包放在一起,然后都传给template,你能用就用,不用也不用管,或者反过来,template在这个池子里面找要用的参数值。
例子2. 下面改写成RequestContext版
from django.template import loader, RequestContext
from django.http import HttpResponse
#使用context processro去提供一些context内容中公共的部分,也就是返回一个字典而已。
def custom_proc(request):