删除/清除 django.contrib.messages

问题描述 投票:0回答:5

我想有条件清除

django.contrib.messages
。这两个问题中讨论的解决方案都不起作用:

删除所有 django.contrib.messages
Django:在显示消息之前删除消息

关于如何清除消息有什么建议吗?我正在使用 django 1.10

代码:

messages = get_messages(request)
for msg in messages:
    pass
for msg in messages._loaded:
    del msg
for msg in messages._queued_messages:
    del msg
django
5个回答
14
投票

单行代码看起来像这样:

list(messages.get_messages(request))

它本质上执行与 @Avukonke Peter 的解决方案相同的任务。但是,我认为没有必要将消息设置为使用的(我相信这是默认完成的,但如果我错了,请随时纠正我)。我不明白为什么没有

messages.clear()
功能。


12
投票

您需要迭代从“get_messages”方法检索到的当前消息集的消息。您可以在任何想要在设置新消息之前清除消息的地方或想要简单地清除所有消息的地方使用此代码。

system_messages = messages.get_messages(request)
for message in system_messages:
    # This iteration is necessary
    pass

注意:如果您不想清除消息,请将 system_messages.used 标志设置为“False”,因为迭代存储实例时消息将被标记为清除(并在处理响应时清除)。 参考:https://docs.djangoproject.com/en/3.0/ref/contrib/messages


3
投票

这是在 Django 4 中唯一对我有用的东西(除了覆盖模板中的

messages
块)*:

from django.contrib.messages.storage import default_storage
request._messages = default_storage(request)

这基本上是重新初始化存储(就像消息中间件一样)。


1
投票

我使用的是 Django 3.2,这里给出的答案都不适合我。不知道为什么。也许这可能是由于新版本中的一些变化造成的。所以我想出了一个方法来做到这一点。如果您需要删除消息或者不想在某个模板上显示消息,只需迭代消息即可,无需在模板文件中执行任何操作。

{% if messages %}
    {% for message in messages %}
    {% endfor %}
{% endif %}

我在模板中添加了这些应删除消息的行。我想现在不可能在视图中执行此操作。仍在寻找社区对此的更多见解。


0
投票

要从 Django 消息存储中清除消息,您可以在迭代消息后使用

storage.used
属性。此属性将消息标记为已使用,从而有效地将它们从存储中清除。

from django.contrib import messages

def custom_login(request):
    error_message = None  # Initialize error message variable
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        storage = messages.get_messages(request)
        for message in storage:
            print(message)  # Optional: Print messages for debugging or logging purposes
        storage.used = True  # Mark messages as used to clear them from storage
        if user is not None:
            login(request, user)
            next_url = request.POST.get('next') or reverse('home')
            return redirect(next_url)
        else:
            error_message = 'Invalid username or password.'
            messages.error(request, error_message)
    return render(request, 'login.html', {'error_message': error_message})

姜戈 4

© www.soinside.com 2019 - 2024. All rights reserved.