Django从自定义中间件添加contrib.messages

时间:2011-05-17 16:43:21

标签: django messages middleware

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

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

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

    我通过迭代中间件中的消息并检查我要添加的消息是否已经在那里来解决了这个问题。如果是,则不会再次添加。

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

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

    感谢。

    编辑:

    有没有办法清除视图中的消息?我试过迭代它们(没有storage.used = False)它们仍在那里。我希望这可以解决我的问题。

4 个答案:

答案 0 :(得分:1)

您可以使用https://github.com/AliLozano/django-messages-extends的粘性邮件,该邮件是一个仅在请求中保留邮件而非保存在会话中的存储

答案 1 :(得分:0)

那么,您使用django.contrib.messages存储永久通知吗?它旨在显示一次性通知,其中用户看到消息一次然后消失。它的用途类型是“表格编辑成功。”等信息。

关于消除用户消息堆栈中的消息需要注意的是:每次使用RequestContext(讨论here)来呈现模板时,所有消息都将被刷新(无论它们是否都是实际上是否显示在页面上。)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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