如何通过接收器调整请求对象的模板上下文?

时间:2014-02-04 06:26:42

标签: django django-signals

我有一个名为user_logged_in的信号在用户登录时被调度。当post_user_logged_in收到信号并且用户有一个名为do_stuff的会话变量时,我想要运行do_stuff(),删除会话变量,然后将新的did_stuff变量添加到模板上下文中,以便我可以显示消息并采取其他客户端操作。信号将请求对象作为参数传递。

如何修改请求对象以在模板上下文中包含我的新变量?我在一些谷歌搜索后尝试了下面的内容,但did_stuff在模板中仍然是空白的。我还考虑使用自定义消息,但感觉不正确。

from django.dispatch import receiver
from django.template import RequestContext
from allauth.account.signals import user_logged_in
from myproject import do_stuff 


@receiver(user_logged_in)
def post_user_logged_in(sender, request, user, **kwargs):
    if 'do_stuff' in request.session:
        del request.session['do_stuff']
        do_stuff()
        request.context = RequestContext(request)
        request.context['did_stuff'] = True

1 个答案:

答案 0 :(得分:1)

上下文不是请求的属性 - 实际上它与它完全分开(*) - 所以这种方法从根本上是错误的。除了其他任何东西,没有单一的“上下文” - 视图可以渲染无,一个或许多模板作为响应的一部分,并且每个模板都有自己的上下文。

我不确定为什么你不能把你的did_stuff放进会话中。或者,如果它需要是暂时的,只需将其添加到请求本身,并在模板中检查。

另一种可能性是让视图返回TemplateResponse,并编写一个定义process_template_response方法的中间件类来更改context_data。

(*)虽然请求可以是 in 上下文中的项目,但如果您使用RequestContext和请求context_processor,则会自动发生。