我正在使用 messages
将 Flash 消息添加到模板中(正如您所期望的那样)。
我遇到的问题是,如果您双击指向生成消息的页面的链接,则该消息会出现两次。
我正在使用该消息告诉用户我已将他们从他们期望去的地方重定向。他们不需要两次相同的消息。
我理解这里的逻辑,但想知道如何删除重复的消息。
最终我希望这是一个
middleware
所以它可以覆盖所有请求。
最佳答案
遇到同样的问题并找到了另一个解决方案,使用自定义 MESSAGE_STORAGE:
from django.contrib.messages.storage.session import SessionStorage
from django.contrib.messages.storage.base import Message
class DedupMessageMixin(object):
def __iter__(self):
msgset = [tuple(m.__dict__.items())
for m in super(DedupMessageMixin, self).__iter__()]
return iter([Message(**dict(m)) for m in set(msgset)])
class SessionDedupStorage(DedupMessageMixin, SessionStorage):
pass
# in settings
MESSAGE_STORAGE = 'some.where.SessionDedupStorage'
这适用于也可以直接处理消息的代码,例如在 View 中。
由于它是一个 mixin,您可以轻松地将其重用于其他消息存储。
这是一种完全避免存储重复项的替代方法:
from django.contrib.messages.storage.session import SessionStorage
from itertools import chain
class DedupMessageMixin(object):
def add(self, level, message, extra_tags):
messages = chain(self._loaded_messages, self._queued_messages)
for m in messages:
if m.message == message:
return
return super(DedupMessageMixin, self).add(level, message, extra_tags)
关于Django:从存储中删除重复的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23249807/