我知道这个问题听起来很奇怪,但是请让我解释一下自己。
我正在使用装饰器使消息持续存在,直到用户实际解除它(就像堆栈溢出消息的行为)。问题是,因此,在用户注销之前添加消息,因此在用户注销后立即显示消息。我想知道在注销视图中删除消息的最佳方法是什么。我想到了两种方法,我想知道是否有人能想到更好的方法。
我现在赞成这个:
storage = messages.get_messages(request)
storage.used = True
通过这个:
storage = messages.get_messages(request)
del storage._loaded_messages[0]
对我而言,第二种方式似乎更明确,即使它更加丑陋:我的意图是删除当前加载的消息,这使得清楚。第一种方法采用一种方法将消息作为副作用清除......但至少它不依赖于dunder变量......你们怎么想?
答案 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.5
和session
消息存储接受的方法,不是诀窍。
我需要使用:
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)