如何通过Django中间件在所有Django上下文中插入文本
这是我的中间件代码:
from django.conf import settings
from django.template import RequestContext
class BeforeFilter(object):
def process_request(self, request):
settings.my_var = 'Hello World'
request.ss = 'ssssssssss'
return None
def process_response(self, request, response):
return response
这是settings.py文件:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
)
MIDDLEWARE_CLASSES = (
...
'middleware.BeforeFilter',
)
这是视图代码:
#coding:utf-8
from django.conf import settings
from django.shortcuts import render_to_response
from django.http import HttpResponse
from django.template import RequestContext
def index(request):
context = RequestContext(request)
context['a'] = 'aaaa'
return render_to_response('a.html',context)
这是HTML代码:
{{a}}fffff{{ss}}
但是它没有显示{{ss}}:
aaaafffff
那么我该如何显示:
aaaafffffssssssss
如何通过Django中间件在所有Django上下文中插入一些文本,
这样我就不需要每次都插入文本了,
谢谢
3 个回答
1
提问者想知道如何通过中间件来实现这个功能,但我发现其实不需要这样做。现在被接受的答案有点过时,而且编辑队列也满了。
从Django 1.10开始,TEMPLATE_CONTEXT_PROCESSORS
这个设置已经被移到了TEMPLATES
的context_processors
选项里。
context_processors
是一个包含了可以调用的Python路径的列表,这些调用会在渲染模板时用来填充上下文。它们会接收一个请求对象作为参数,并返回一个字典,这个字典里的内容会被合并到上下文中。默认情况下,这个列表是空的。
# context_processors.py
def sample_context_processor(request):
return {'key': 'value'}
# settings.py
TEMPLATES = [
{
'OPTIONS': {
'context_processors': [
'myproject.context_processors.sample_context_processor',
],
},
},
]
3
你需要在模板中明确说明你要访问的是 request
。如果你只是写 {{ss}}
,那么这个变量是不存在的,因为它是 request
的一个属性(你是用 request.ss = 'ssssssssss'
来设置的,对吧?)。所以在你的模板中应该写 {{request.ss}}
,这样就能正常工作了。
26
为了实现你的最初目标,我觉得不需要用BeforeFilter这个中间件。我们只需要一个模板上下文处理器就可以了。
你可以这样写一个上下文处理器:
#file: context_processors.py
def sample_context_processor(request):
return {'ss':'ssssssssss'} #or whatever you want to set to variable ss
然后把这个上下文处理器添加到TEMPLATE_CONTEXT_PROCESSORS列表里。
#file: settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
'myproject.context_processors.sample_context_processor',
)