【问题标题】:Remove messages before the response is rendered在呈现响应之前删除消息
【发布时间】:2019-12-02 15:27:43
【问题描述】:

我有一个页面,其中包含 2 个表单并允许更新附加到每个表单的模型。

我还集成了消息框架,这在很大程度上是完美的。但是在发布到此页面后,您会收到两条成功消息,我想在它们的位置显示 1 条简单消息。

我尝试了其他问题中建议的各种方法;

Django: Remove message before they are displayed

Deleting/Clearing django.contrib.messages

但我无法清除消息队列。

def post(self, request, **kwargs):
    profile_valid = False
    user_valid = False

    post_data = request.POST or None

    profile_form = self.profile_form_class(
        post_data,
        instance=request.user.profile,
        prefix='profile'
    )
    user_form = self.user_form_class(
        post_data,
        instance=request.user,
        prefix='user'
    )

    context = self.get_context_data(
        profile_form=profile_form,
        user_form=user_form
    )

    if profile_form.is_valid():
        profile_valid = True
        self.form_save(profile_form)
    if user_form.is_valid():
        user_valid = True
        self.form_save(user_form)

    if profile_valid and user_valid:
        # First get the messages from the above save methods
        storage = messages.get_messages(request)
        for message in storage:
            # Need to iterate over the messages to achieve what we need
            pass
        # Set the messages as used
        storage.used = True

        # Add our simple message
        messages.success(self.request, self.success_message)

    return self.render_to_response(context)

我正在使用基于会话的消息存储,但这似乎对视图中的可用内容没有影响。

我正在使用;

  • Django 2.2
  • Python 3.7

【问题讨论】:

  • 你试过this吗?那是唯一对我有用的。
  • @PedramParsian 稍作修改即可。
  • 很高兴为您提供帮助。请考虑使用 working 版本的代码添加答案。
  • @PedramParsian 谢谢。我刚刚完成了测试并添加了我的解决方案。

标签: django django-messages


【解决方案1】:

这里的解决方案是遍历加载的消息和del每条消息;

storage = messages.get_messages(request)
for _ in storage:
    # This is important
    # Without this loop `_loaded_messages` is empty
    pass

for _ in list(storage._loaded_messages):
    del storage._loaded_messages[0]

messages.success(self.request, "Details updated")

return self.render_to_response(context)

在呈现的页面上,我会看到 1 条消息,“详细信息已更新”。

这类似于这里提出的解决方案; https://stackoverflow.com/a/30517135/9733868

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多