首页 > 解决方案 > 在 LogoutView 上显示消息

问题描述

我正在使用消息框架来处理基本的事情,比如用户登录时的成功消息。这工作正常。

但是,当用户注销时,我无法让它工作。我不是网络开发人员,所以对 django 不是特别强,所以不确定我做错了什么 - 有类似的问题: 注销 Django 时的 django 消息 如何使用 django.contrib.auth 添加注销成功消息? 使用信号的解决方案-在尝试之前,我想了解为什么下面的代码不起作用。我显然错过了一些东西!

请注意,在我的模板中,如果没有消息,我添加了一个条件来打印一些文本 - 该文本确实会打印出来,所以我的 messages.html 肯定被包含在内。

视图.py

class LogoutFormView(SuccessMessageMixin,LogoutView):
template_name = 'users/logout.html'
success_message = "Successfully logged out."

class login_view(SuccessMessageMixin,LoginView):
template_name = 'users/login.html'
success_message = "Successfully logged in."
def get_success_url(self):
    return reverse('recordings:projects')

消息.html

{% if messages %}
{% for message in messages %}
<div class="alert {{ message.tags }} alert-dismissible" role="alert">
    <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
            aria-hidden="true">&times;</span> </button>
    {{ message }}
</div>
{% endfor %}
{% endif %}

在模板中,我的登录重定向和 logout.html 都扩展了:

<div class="container-fluid mt-3 pl-5 pr-5">
    {% block messages %}
    {% if messages %}
    test-messages
    {% else %}
    test-no-messages
    {% endif %}
    {% include "common/messages.html" %}
    {% endblock %}
</div>

标签: pythondjangodjango-views

解决方案


LogoutViewis not a FormViewso using theSuccessMessageMixin在这里没有意义,因为它不会做任何事情

LogoutView调用该logout方法和注销方法调用 request.session.flush()这将在使用SessionStorage后端时删除所有消息

您可以转而使用CookieStorage后端,因为我认为这不会受到影响,request.session.flush或者您可以覆盖的dispatch方法LogoutView并在调用后添加消息,request.session.flush尽管我不确定这是否会起作用

def dispatch(self, request, *args, **kwargs):
    response = super().dispatch(request, *args, **kwargs)
    messages.add_message(request, messages.INFO, 'Successfully logged out.')
    return response

推荐阅读