Django - 在模板之前访问上下文字典

时间:2012-02-12 00:07:08

标签: django django-middleware django-context

我希望在实际渲染之前使用上下文处理器或中间件来修改传递给render_to_response的字典的值。我有一个我正在尝试实现的消息传递模式,它将基于我想在呈现模板之前搜索上下文的用户类型的存在来填充消息列表。

示例:

def myview(...):
    ...
    return render_to_response('template.html',
        {'variable': variable},
    )

我希望能够在上下文中添加关于'变量'存在的其他信息。

如何在我的视图定义之后但在它到达模板之前访问“变量”以便我可以进一步修改上下文?

3 个答案:

答案 0 :(得分:5)

使用TemplateResponse

from django.template.response import TemplateResponse

def myview(...):
    ...
    return TemplateResponse(request, 'template.html', 
        {'variable': variable},
    )

def my_view_wrapper(...):
    response = my_view(...)
    variable = response.context_data['variable']
    if variable == 'foo':
        response.context_data['variable_is_foo'] = True
    return response

答案 1 :(得分:2)

这很容易。如果您在示例中仅提供了 little 位代码,那么答案可能会让您感到痛苦。

# first build your context, including all of the context_processors in your settings.py
context = RequestContext(request, <some dict values>)
# do something with your Context here
return render_to_response('template.html', context)

更新评论:

render_to_response()的结果是一个HTTPResponse对象,其中包含针对Context呈现的模板。那个对象(据我所知)没有与之相关的上下文。我想你可以将render_to_response()的结果保存在一个变量中,然后访问你传递它的Context,但我不确定你要解决的是什么问题。

您在渲染过程中修改了上下文吗?如果是这样,您可能会发现信息不再存在,因为Context具有在模板处理期间推送/弹出的范围堆栈。

答案 2 :(得分:0)

您可以为上下文创建字典:

def myview(...):
    c = dict()
    c["variable"] = value
    ...
     do some stuff
    ...
    return render_to_response('template.html',c)

也许RequestContext就是你要找的东西。