Django:从存储中删除重复的消息

标签 django django-middleware django-messages

我正在使用 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/

    相关文章:

    python - 为 Django 中的字段设置数据库级默认值?

    django - AttributeError : 'WSGIRequest' object has no attribute 'session'

    python - 如何在 Django 中设置自定义中间件

    python - 我如何使用 HTTPResponseRedirect 对 django 消息进行单元测试?

    django - 确保 django 模型已正确保存

    python - Django Twitter 克隆。如何限制用户多次点赞一条推文?

    python - 使模型中的用户默认为当前用户

    python - django中间件重定向无限循环

    尽管 RequestContext,Django 消息传递框架不显示消息

    python - 是否有模型类型可以在 django 中存储标签?