【问题标题】:Django add contrib.messages from custom middlewareDjango 从自定义中间件添加 contrib.messages
【发布时间】:2011-05-17 16:43:21
【问题描述】:

我已经实现了一个自定义中间件,用于检查用户配置文件中的某些字段。注册时不需要这些字段(为了使用户能够快速轻松地注册),但是,我希望他们填写它们。

我的中间件检查它们是否已设置。如果没有,它会通过消息通知用户。我遇到了两个问题。

  1. 每当我提交发布的表单时,由于没有模板显示消息,中间件会再次添加消息,因为在发布消息时调用了中间件,并且在重定向之后再次调用了它。

    我通过遍历中间件中的消息并检查我要添加的消息是否已经在其中解决了这个问题。如果是,则不再添加。

  2. 当用户通过更新他们的个人资料来解决问题时,在下一页加载时,消息仍然存在。但在那之后,一切正常。在我的中间件开始时,我实际上放了一个检查,如果请求已发布,则返回 None(我原以为这会解决这两个问题,但它都没有解决)。

知道如何解决第二个问题吗?有没有更好的方法来解决我的第一个问题?

谢谢。

编辑:

有没有办法清除视图中的消息?我已经尝试遍历它们(没有 storage.used=False),它们仍然存在。我希望这能解决我的两个问题。

【问题讨论】:

    标签: django messages middleware


    【解决方案1】:

    Yoy 可以使用 https://github.com/AliLozano/django-messages-extends 的粘滞消息,这是一种仅将消息保存在请求中而不是保存在会话中的存储

    【讨论】:

      【解决方案2】:

      那么,您是否使用django.contrib.messages 来存储永久通知?它旨在显示一次性通知,用户在其中看到消息一次然后消失。它所指的事物类型是诸如“表单已成功编辑”之类的消息。

      就删除用户消息堆栈中的消息而言:任何时候使用RequestContext(讨论过here)来呈现模板,所有消息都将被刷新(无论它们是否实际显示在页面与否)。

      我不完全确定这就是你真正想要的答案,我对你的问题有点困惑。但是,我有点确定您使用的消息超出了预期目的,这可能就是您遇到麻烦的原因。

      【讨论】:

      • 这些消息不是永久的。但是,它们可能不仅仅是一次性消息。我们的想法是检查个人资料中的错误并检查他们是否已经验证了他们的电子邮件并让他们知道,直到他们知道为止。
      【解决方案3】:

      您可以使用中间件的process_reponse() 方法来添加消息。到那时,您将知道是否向用户显示消息,具体取决于他的个人资料现在是否填写了该字段。

      考虑使用 django.contrib.messages。可能您不想在所有请求上显示“填写 XYZ 字段”消息,而只在少数页面上显示,例如每当用户登录或查看他的个人资料页面时。

      【讨论】:

        【解决方案4】:

        只需将创建消息的逻辑放置到context processor 而不是中间件。修改请求并返回空字典。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-31
          • 1970-01-01
          • 2014-02-13
          • 1970-01-01
          • 1970-01-01
          • 2021-08-06
          相关资源
          最近更新 更多