在django中默认使用Context传递数据,一个Context是一系列变量和值的集合,它和Python的字典有点相似
例:
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 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 t.render(c)
view_1和view_2中每个视图给模板传了3个相同的变量:app、user、ip_address,这增加了代码的冗余,此时使用RequestContext
方法一:
def custom_proc(request):
"A context processor that provides 'app', 'user' and 'ip_address'."
return {
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR']
}
def view_1(request):
# ...
t = loader.get_template('template1.html')
c = RequestContext(request, {'message': 'I am view 1.'},
processors=[custom_proc])
return t.render(c)
def view_2(request):
# ...
t = loader.get_template('template2.html')
c = RequestContext(request, {'message': 'I am the second view.'},
processors=[custom_proc])
return t.render(c)
方法二:
setting.py中TEMPLATES_CONTEXT_PROCESSORS项,django1.8在TEMPLATES中
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'myproject.context_processors',
],
},
vim context_processors.py
def name_proc(request):
user_id = request.user.id
......
info_dic = {
'session_user_id': user_id,
......
}
return info_dic
模板中即可直接调用:{{ session_user_id }}
RequestContext依次调用这些processors,往当前context中放入这里定义的默认变量。可自定义一个processors然后添加到这里。注意:使用RequestContext时,应作为第三个参数传入
-
django.core.context_processors.auth
如果 TEMPLATE_CONTEXT_PROCESSORS 包含了这个处理器,那么每个 RequestContext 将包含这些变量:
- user :一个 django.contrib.auth.models.User 实例,描述了当前登录用户(或者一个 AnonymousUser 实例,如果客户端没有登录)。
- messages :一个当前登录用户的消息列表(字符串)。 在后台,对每一个请求,这个变量都调用 request.user.get_and_delete_messages() 方法。 这个方法收集用户的消息然后把它们从数据库中删除。
- perms : django.core.context_processors.PermWrapper 的一个实例,包含了当前登录用户有哪些权限。
-
django.core.context_processors.i18n
如果这个处理器启用,每个 RequestContext 将包含下面的变量.
- LANGUAGES : LANGUAGES 选项的值
- LANGUAGE_CODE :如果 request.LANGUAGE_CODE 存在,就等于它;否则,等同于 LANGUAGE_CODE 设置
-
django.core.context_processors.request
如果启用这个处理器,每个 RequestContext 将包含变量 request , 也就是当前的 HttpRequest 对象。 注意这个处理器默认是不启用的,你需要激活它
如果你发现你的模板需要访问当前的HttpRequest你就需要使用它:
{{ request.REMOTE_ADDR }}