Django 上下文处理器
模板要在上下文中渲染。
上下文是django.template.Context的实例。django.template.RequestContext是Django提供的一个子类。
django.template.RequestContext默认为模板上下文添加很多变量。使用render()快捷方式时,如果没有明确传入其他上下文,默认使用RequesetContext。
django.template.Context的实例
from django.template import loader,
Context def index(request): ......
t = loader.get_template("index.html") # 手动加载模板 c = Context( 'app':'app01', 'user':request.user, 'id_addr':request.META['REMOTE_ADDR'] 'message':'index view' )
# 构建上下文对象 return t.render(c) # 渲染模板 def home(request): ......
t = loader.get_template("home.html") # 手动加载模板 c = Context( 'app':'app01', 'user':request.user, 'id_addr':request.META['REMOTE_ADDR'] 'message':'home view' )
# 构建上下文对象 return t.render(c) # 渲染模板
django.template.RequestContext和上下文处理器就是为了处理变量重复的问题而出现的。上下文处理器用于指定自动在各个上下文中设定的变量。这样就不需要调用render()时都指定。
django.template.RequestContext的处理办法
使用上下文处理器的做法是创建处理器,将处理器传给RequestContext。
from django.template import loader, RequestContext def custom_proc(request): # 上下文处理器 return {
"app01":"app01", "user":request.user,
"id_addr":request.META['REMOTE_ADDR'] }
def index(request):
...... t =
loader.get_template("index.html")
# 手动加载模板 c = RequestContext( request, {'message':'index view'}, processors=[custom_proc]) return t.render(c) def index(request): ...... t = loader.get_template("home.html") # 手动加载模板 c = RequestContext( request, {'message':'home view'}, processors=[custom_proc]) return t.render(c)
这是没有使用render()快捷方式,这样避免了在模板中自己手动调用loader.get_template(),创建上下文处理器。
还有个方法context_instance参数将进一步缩减代码。
使用context_instance参数
from django.shortcuts import render from
django.template import loader, RequestContext
def custom_proc(request): # 上下文处理器
return {
"app01":"app01", "user":request.user,
"id_addr":request.META['REMOTE_ADDR'] }
def index(request):
...... return render( request, {'message':'index view'}, context_instance=RequestContext(
request,processors=[custom_proc]
) ) def index(request): ...... return render( request, {'message':'home view'}, context_instance=RequestContext(
request,processors=[custom_proc]
) )
全局上下文处理器
context_processors设置(在settings.py文件中)指明始终提供给RequestContext的上下文处理器。
context_processors的默认值如下:
'context_processors':[ 'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.context_processors.auth',
'django.contrib.messages.context_processors.messages', ],
这是个可调用的列表,接口与前文定义的custom_proc函数一样——参数是一个请求对象,返回值是一个字典。
注意:
context_processors中的值是字符串,因此处理器要在Python路径中。