Django:在显示之前删除消息

Int*_*ude 22 django messages

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

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

我现在赞成这个:

storage = messages.get_messages(request)
storage.used = True
Run Code Online (Sandbox Code Playgroud)

在此:

storage = messages.get_messages(request)
del storage._loaded_messages[0]
Run Code Online (Sandbox Code Playgroud)

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

ima*_*rer 7

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

list(messages.get_messages(request))
Run Code Online (Sandbox Code Playgroud)


Int*_*ude 6

为了解决这个问题,我要将我使用的方法标记为"答案".感谢那些评论的人.

我跟着这个:

storage = messages.get_messages(request)
storage.used = True
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*lla 5

我不得不使用上面提出的解决方案的2 toghether,因为没有人独显足够多的:

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

if len(storage._loaded_messages) == 1: 
    del storage._loaded_messages[0]
Run Code Online (Sandbox Code Playgroud)

至于可以接受的解决方案,我可以多次遍历消息,发现消息似乎没有被“消耗”。