帮助处理process_template_response django中间件

时间:2011-03-17 02:24:45

标签: django middleware

我正在尝试使用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

由于

4 个答案:

答案 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添加上下文变量。