模板|自定义 context_processors
Django 版本
1.6.7
原因
因为当前模块下的所有视图都需要共同变量,就想到了利用模板系统的自定义 context_processors
目的
偷懒,降低工作量,重用
准备
模块:blog(这是我自己创建的模块)
步骤
1 自定义函数
考虑到 pythonic 原则,我把文件放到模块下,并起名为 context_processors.py
路径为 blog/context_processors.py
自定义函数(测试随写的)
# -*- coding: UTF-8 -*-
# 注意:这里只有一个参数 即 HttpRequest 对象或当前用户的其他信息
def custom_proc(request):
user = {'name': 'allen', 'sex': 'man'}
return user
2 视图逻辑
# -*- coding: UTF-8 -*-
from django.template import RequestContext
from django.shortcuts import render_to_response
import datetime
def time(request):
current_date = datetime.datetime.now();
return render_to_response('test.html', locals(),
context_instance=RequestContext(request))
3 TEMPLATE_CONTEXT_PROCESSORS 设置
注意:不同django版本的 TEMPLATE_CONTEXT_PROCESSORS
默认配置是不同的,请到官方文档查阅相关信息
默认情况下,配置文件中是没有
TEMPLATE_CONTEXT_PROCESSORS
配置项的,所以这里需要自己添加
配置如下:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.core.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'blog.context_processors.custom_proc',
)
4 模板中调用
name: {{ name }}::sex {{sex}}
思考
这样让我降低了很多的工作量,但是在视图中每次都要去写 context_instance=RequestContext(request)
, 这对我来说是极度痛苦的
解决方法
在 TEMPLATE_CONTEXT_PROCESSORS
中添加django.core.context_processors.request
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.core.context_processors.tz',
'django.core.context_processors.request',
'django.contrib.messages.context_processors.messages',
'blog.context_processors.custom_proc',
)
这样就免去了在视图中每次都要去写 context_instance=RequestContext(request)
的痛苦
视图逻辑
# -*- coding: UTF-8 -*-
from django.template import RequestContext
from django.shortcuts import render_to_response
import datetime
def time(request):
current_date = datetime.datetime.now();
return render_to_response('test.html', locals())