在django中默認(rèn)使用Context傳遞數(shù)據(jù),一個(gè)Context是一系列變量和值的集合,它和Python的字典有點(diǎn)相似
例:
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中每個(gè)視圖給模板傳了3個(gè)相同的變量:app、user、ip_address,這增加了代碼的冗余,此時(shí)使用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項(xiàng),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
模板中即可直接調(diào)用:{{ session_user_id }}
RequestContext依次調(diào)用這些processors,往當(dāng)前context中放入這里定義的默認(rèn)變量。可自定義一個(gè)processors然后添加到這里。注意:使用RequestContext時(shí),應(yīng)作為第三個(gè)參數(shù)傳入
-
django.core.context_processors.auth
如果 TEMPLATE_CONTEXT_PROCESSORS 包含了這個(gè)處理器,那么每個(gè) RequestContext 將包含這些變量:
- user :一個(gè) django.contrib.auth.models.User 實(shí)例,描述了當(dāng)前登錄用戶(或者一個(gè) AnonymousUser 實(shí)例,如果客戶端沒(méi)有登錄)。
- messages :一個(gè)當(dāng)前登錄用戶的消息列表(字符串)。 在后臺(tái),對(duì)每一個(gè)請(qǐng)求,這個(gè)變量都調(diào)用 request.user.get_and_delete_messages() 方法。 這個(gè)方法收集用戶的消息然后把它們從數(shù)據(jù)庫(kù)中刪除。
- perms : django.core.context_processors.PermWrapper 的一個(gè)實(shí)例,包含了當(dāng)前登錄用戶有哪些權(quán)限。
-
django.core.context_processors.i18n
如果這個(gè)處理器啟用,每個(gè) RequestContext 將包含下面的變量.
- LANGUAGES : LANGUAGES 選項(xiàng)的值
- LANGUAGE_CODE :如果 request.LANGUAGE_CODE 存在,就等于它;否則,等同于 LANGUAGE_CODE 設(shè)置
-
django.core.context_processors.request
如果啟用這個(gè)處理器,每個(gè) RequestContext 將包含變量 request , 也就是當(dāng)前的 HttpRequest 對(duì)象。 注意這個(gè)處理器默認(rèn)是不啟用的,你需要激活它
如果你發(fā)現(xiàn)你的模板需要訪問(wèn)當(dāng)前的HttpRequest你就需要使用它:
{{ request.REMOTE_ADDR }}