我正在尝试使用process_template_response编写一个django中间件,但我觉得它不起作用,任何人都可以帮我解决这个问题,或者举例说明如何使用该方法。
下面是我的代码:
class MiddleWare(object):
def process_template_reponse(self, request, response):
response.context_data = dict(title='title')
response.template_name = 'pages/helloworld.html'
return response
在settings.py 中
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'proj.app.middleware.MiddleWare', # here my middleware
)
模板中的
<!-- nothing is showing -->
{% block title %}{{ title }}{% endblock %}
顺便说一句,我正在使用Django 1.3 rc 1
由于
答案 0 :(得分:7)
http://docs.djangoproject.com/en/dev/topics/http/middleware/#process-template-response
您使用的是新的SimpleTemplateResponse
响应类吗?
您的视图必须返回SimpleTemplateResponse
或子类才能使新process_template_response
中间件挂钩生效。
从文档复制:
def my_view(request):
# Create a response
response = TemplateResponse(request, 'mytemplate.html', {})
# Register the callback
response.add_post_render_callback(my_render_callback)
# Return the response
return response
答案 1 :(得分:6)
TL; DR :您必须使用TemplateResponse
呈现模板:
from django.template.response import TemplateResponse
def myView(request):
context = {'foo':'foo_value'}
return TemplateResponse(request,'foo.html', context)
当您使用从render
导入的旧版django.shorcuts
呈现模板时,会出现问题。正如process_template_response()
TemplateResponse
中所述,当响应为TemplateResponse
或等效时,会调用此挂钩。所以你应该做的是使用TemplateResponse
来渲染你的模板,你的中间件就可以工作。
您还可以将render
设为from django.template.response import TemplateResponse as render
,因此您无需更改所有观看次数。我个人不推荐这个。
{{1}}
答案 2 :(得分:5)
以下是使用process_template_response方法的简单中间件的工作示例。
class ExampleMiddleware(object):
def process_template_response(self, request, response):
response.context_data['title'] = 'We changed the title'
return response
此中间件更改模板上下文数据中的title变量的值。通过将此中间件添加到设置文件中的MIDDLEWARE_CLASSES来安装此中间件。然后访问django管理员应用程序中的任何页面,您应该看到页面标题更改为我们更改了标题。
答案 3 :(得分:2)
我已经解决了创建自定义模板标记的问题。我只是想知道如何在中间件中使用process_template_reponse添加上下文变量。