我有一个名为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
答案 0 :(得分:1)
上下文不是请求的属性 - 实际上它与它完全分开(*) - 所以这种方法从根本上是错误的。除了其他任何东西,没有单一的“上下文” - 视图可以渲染无,一个或许多模板作为响应的一部分,并且每个模板都有自己的上下文。
我不确定为什么你不能把你的did_stuff
放进会话中。或者,如果它需要是暂时的,只需将其添加到请求本身,并在模板中检查。
另一种可能性是让视图返回TemplateResponse,并编写一个定义process_template_response
方法的中间件类来更改context_data。
(*)虽然请求可以是 in 上下文中的项目,但如果您使用RequestContext和请求context_processor,则会自动发生。