Django:在显示之前删除消息

时间:2010-11-03 00:01:29

标签: django messages

我知道这个问题听起来很奇怪,但是请让我解释一下自己。

我正在使用装饰器使消息持续存在,直到用户实际解除它(就像堆栈溢出消息的行为)。问题是,因此,在用户注销之前添加消息,因此在用户注销后立即显示消息。我想知道在注销视图中删除消息的最佳方法是什么。我想到了两种方法,我想知道是否有人能想到更好的方法。

我现在赞成这个:

storage = messages.get_messages(request)
storage.used = True

通过这个:

storage = messages.get_messages(request)
del storage._loaded_messages[0]

对我而言,第二种方式似乎更明确,即使它更加丑陋:我的意图是删除当前加载的消息,这使得清楚。第一种方法采用一种方法将消息作为副作用清除......但至少它不依赖于dunder变量......你们怎么想?

6 个答案:

答案 0 :(得分:7)

我喜欢这种更简单的方法来清除底层迭代器,因为我实际上想在标准Django消息的位置添加一条新消息。

list(messages.get_messages(request))

答案 1 :(得分:5)

为了解决这个问题,我要将我选择的方法标记为“答案”。感谢那些评论的人。

我接受了这个:

storage = messages.get_messages(request)
storage.used = True

因为它看起来更干净,更容易测试,并且符合项目其余部分的一般做法。

答案 2 :(得分:3)

我不得不使用上面提出的两个解决方案 toghether ,因为没有一个人愿意:

storage = messages.get_messages(request)
for _ in storage: 
    pass

if len(storage._loaded_messages) == 1: 
    del storage._loaded_messages[0]

就已接受的解决方案而言,我可以循环几次消息 而且我发现这些消息似乎并没有消耗掉#34;

答案 3 :(得分:2)

如果您的退出视图始终重定向到“退出页面”,那么您只需更改退出模板即可隐藏您的消息。

例如,在模板中:

{% block extra-header %}
<style type="text/css">
    #message-id { display: none; }
</style>
{% endblock %}

感觉有点'hacky',但我认为它肯定不如你的#2。

答案 4 :(得分:2)

对于我Django 1.5session消息存储接受的方法,不是诀窍。

我需要使用:

storage = messages.get_messages(request)
for _ in storage:
    pass

摆脱存储中的邮件。

答案 5 :(得分:0)

Django Admin (使用Django==1.11.6测试)中执行相同操作的一种方法是覆盖response_post_*

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广告)。

def response_post_save_change(self, request, obj):
    storage = messages.get_messages(request)

    if len(storage._queued_messages) > 1:
        del storage._queued_messages[-1]

    return super().response_post_save_change(request, obj)