Django:在显示消息之前删除消息
我知道这个问题听起来很奇怪,但请让我解释一下Django:在显示消息之前删除消息,django,messages,Django,Messages,我知道这个问题听起来很奇怪,但请让我解释一下 storage = messages.get_messages(request) for _ in storage: pass 我正在使用一个装饰程序使一条消息持久化,直到用户实际拒绝它为止(就像堆栈溢出的消息的行为)。问题是,因此,在用户注销之前添加消息,因此在用户注销之后立即显示消息。我想知道在注销视图中删除消息的最佳方式是什么。我已经想到了两种方法,我想知道是否有人能想出更好的方法 storage = messages.get_mes
storage = messages.get_messages(request)
for _ in storage:
pass
我正在使用一个装饰程序使一条消息持久化,直到用户实际拒绝它为止(就像堆栈溢出的消息的行为)。问题是,因此,在用户注销之前添加消息,因此在用户注销之后立即显示消息。我想知道在注销视图中删除消息的最佳方式是什么。我已经想到了两种方法,我想知道是否有人能想出更好的方法
storage = messages.get_messages(request)
for _ in storage:
pass
我目前倾向于这样:
storage = messages.get_messages(request)
storage.used = True
storage = messages.get_messages(request)
for _ in storage:
pass
在这方面:
storage = messages.get_messages(request)
del storage._loaded_messages[0]
storage = messages.get_messages(request)
for _ in storage:
pass
对我来说,第二种方式似乎更明确,尽管它更丑陋:我的意图是删除当前加载的消息,这一点很清楚。第一种方法采用一种方法,通过这种方法,信息将作为副作用被清除。。。但至少它不依赖于dunder变量。。。你们怎么看?如果您的注销视图总是重定向到“注销页面”,那么您可以更改注销模板以隐藏您的消息
storage = messages.get_messages(request)
for _ in storage:
pass
e、 例如,在模板中:
{% block extra-header %}
<style type="text/css">
#message-id { display: none; }
</style>
{% endblock %}
storage = messages.get_messages(request)
for _ in storage:
pass
{%block-extra-header%}
#消息id{显示:无;}
{%endblock%}
它感觉有点“黑客”,但我认为它肯定没有你的#2那么黑客。为了解决问题,我将使用的方法标记为“答案”。感谢那些评论的人
storage = messages.get_messages(request)
for _ in storage:
pass
我是这样说的:
storage = messages.get_messages(request)
storage.used = True
storage = messages.get_messages(request)
for _ in storage:
pass
因为它看起来更干净,更容易测试,并且符合项目其余部分的一般实践。对于我来说,在
Django 1.5
和session
消息存储中接受的方法不是诀窍
storage = messages.get_messages(request)
for _ in storage:
pass
我需要使用:
storage = messages.get_messages(request)
for _ in storage:
pass
从存储中删除消息。我喜欢这种清除底层迭代器的简单方法,因为我实际上想添加一条新消息来代替标准的Django消息
storage = messages.get_messages(request)
for _ in storage:
pass
list(messages.get_messages(request))
我不得不同时使用上面提出的两种解决方案,因为没有一个人是足够的:
storage = messages.get_messages(request)
for _ in storage:
pass
storage = messages.get_messages(request)
for _ in storage:
pass
if len(storage._loaded_messages) == 1:
del storage._loaded_messages[0]
就可接受的解决方案而言,我可以多次循环消息
我看到消息似乎没有被“消费”在Django Admin中做同样事情的一种方法(使用
Django==1.11.6
测试)是覆盖响应\u post*
storage = messages.get_messages(request)
for _ in storage:
pass
def response_post_save_change(self, request, obj):
storage = messages.get_messages(request)
storage._loaded_messages = []
return super().response_post_save_change(request, obj)
如果您只想保留自定义消息(例如,添加到save_model
或任何其他重写方法中),请删除最后一条排队消息(默认情况下是Django ads)
storage = messages.get_messages(request)
for _ in storage:
pass
我猜默认情况下会实现storage.used=True。你不需要写它。如果重写默认行为,则需要写入storage.used=False。我最终使用了第一个方法。我基本上想强制默认行为而不显示消息。设置storage.used=True会让它认为它已经显示了消息,因此对我来说是可行的。我同意第一种方法更好。如果您想让它更明确,您可以创建一个名为
clear\u messages
的函数来执行这两个步骤。然后,如果由于某种原因,storage.used=True
的行为发生变化,您可以更新该函数。@Jordan:我喜欢clear\u messages函数的想法。也许是时候进行重构了。我没有想到这种方法,但在整个项目范围内,控制消息显示的逻辑与模板代码是分开的。另外,在我看来,第一种方法更容易测试。如果您不想向匿名用户显示消息,您还可以将消息显示逻辑包装在{%if user.is_authenticated%}
中。我也没有找到其他可行的解决方案,但这个解决方案对我有效。我遗漏了uu in storage…部分的,该部分工作正常(使用Django 2.2.6)。这对我不起作用。这在最新的Django版本中对我不起作用