Python 确定用户是否已在“中进行身份验证”;LogoutView";

Python 确定用户是否已在“中进行身份验证”;LogoutView";,python,django,django-generic-views,Python,Django,Django Generic Views,当您转到127.0.0.1:8000/admin/logout时,Django始终显示相同的页面,无论您之前是否登录过 我想要的是显示一条注销成功消息,仅当用户之前经过身份验证时才显示;如果用户未经身份验证,则显示错误消息,然后尝试注销 我还需要在我的注销成功消息中包含用户的名字 我使用基于类的django.contrib.auth.views.LogoutView视图,如下所示: classsignoutview(LogoutView): template_name=“users/signou

当您转到
127.0.0.1:8000/admin/logout
时,Django始终显示相同的页面,无论您之前是否登录过

我想要的是显示一条注销成功消息,仅当用户之前经过身份验证时才显示;如果用户未经身份验证,则显示错误消息,然后尝试注销

我还需要在我的注销成功消息中包含用户的名字

我使用基于类的
django.contrib.auth.views.LogoutView
视图,如下所示:

classsignoutview(LogoutView):
template_name=“users/signout.html”
def get_next_url(自我):
重定向到=self.request.GET.GET(“下一步”,“/”)
返回重定向到
以下是模板:

{% if messages %}
          {% for message in messages %}
                        <div class="alert temp-alert {% if message.tags %}alert-{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}danger{% else %}{{ message.tags }}{% endif %}{% endif %}" role="alert">{{ message }}</div>
          {% endfor %}
{% endif %}
{%extends“base.html”%}
{%block content%}
注销页面

{%if_已通过身份验证%} 您已从您的帐户{{first_name{124; capfirst}注销! 感谢您今天花了一些宝贵的时间在我的网站上


{%else%} 哦,不! 看起来你没有登录!所以你不能注销!酷,是吗

{%endif%} {%endblock%} {%block js%} {%if_已通过身份验证%} var计数=5; var url=“{redirect_address}}”; var countdown=setInterval(函数(){ $('#displayTimer').text(“您将在“+计数--+”秒…”内重定向到主页); 如果(计数<0){ $('#displayTimer').text(“重定向…”); 清除间隔(倒计时); $(location.attr(“href”,url); } }, 1000); {%endif%} {%endblock%}
我向视图添加额外内容,如下所示:

classsignoutview(LogoutView):
template_name=“users/signout.html”
def设置额外上下文(自身):
返回{
'was_authenticated':self.request.user.was_authenticated,
“first\u name”:self.request.user.first\u name,
}
def get_next_url(自我):
重定向到=self.request.GET.GET(“下一步”,“/”)
返回重定向到
但该函数似乎会在注销过程后运行,因此
was\u authenticated
将始终为False,而
first\u name
始终为None

我知道如何使用基于函数的视图处理这种情况,但我更喜欢使用基于类的视图(如果可能的话!)


提前感谢。

将用户注销是
分派方法中的第一个操作。因此,要从该用户捕获数据(如名字),您必须重写此方法并在调用注销之前捕获该数据

你可以这样做

@method_decorator(never_cache)
def dispatch(self, request, *args, **kwargs):
    if request.user.is_authenticated:
        self.first_name = request.user.first_name
    return super().dispatch(request, *args, **kwargs)
源中的行以供参考

在python(>=3.6)脚本中:重写
dispatch
方法,如bellow并添加成功消息

from django.contrib import messages

class SignoutView(LogoutView):
    template_name = "users/signout.html"

    def dispatch(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            messages.success(request, f'{request.user.first_name} successfully logged out')
        else:
            messages.error(request, f'{request.user.first_name} your error message')
        return super().dispatch(request, *args, **kwargs)
在模板中:

{% if messages %}
          {% for message in messages %}
                        <div class="alert temp-alert {% if message.tags %}alert-{% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}danger{% else %}{{ message.tags }}{% endif %}{% endif %}" role="alert">{{ message }}</div>
          {% endfor %}
{% endif %}
{%if消息%}
{消息%中的消息为%s}
{{message}}
{%endfor%}
{%endif%}