Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:在显示消息之前删除消息_Django_Messages - Fatal编程技术网

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版本中对我不起作用