Django:基于类的视图注销用户(如果不是员工)

Max*_*ian 3 python django django-views django-class-based-views

我是 Django 新手,我正在尝试使用 来PermissionRequiredMixin验证经过身份验证的用户是否staff在访问页面之前,如果他没有经过身份验证,则视图会将用户重定向到登录页面,在此页面上加载一个表单django.contrib.auth.views.login, 好的。但是,如果用户已通过身份验证而他未通过身份验证staff,则重定向时他在登录页面上不会有任何表单。

我应该怎么办?当用户尝试访问仅限员工页面时,如果用户不是员工,请注销该用户?如果是,我该如何使用CBVwith来做到这一点TemplateView

看法

from django.contrib.auth.mixins import PermissionRequiredMixin
# ...
class AdminView(PermissionRequiredMixin, TemplateView):
    permission_required = 'is_staff'
    template_name = 'checkout/admin.html'
Run Code Online (Sandbox Code Playgroud)

登录网址

from django.contrib.auth.views import login
# ...
url(r'^entrar/$', login, {'template_name': 'accounts/login.html'}, name='login')
Run Code Online (Sandbox Code Playgroud)

小智 6

试试这个混合:

from django.contrib.auth.mixins import LoginRequiredMixin, AccessMixin
from django.contrib.auth import logout

class LogoutIfNotStaffMixin(AccessMixin):
        def dispatch(self, request, *args, **kwargs):
            if not request.user.is_staff:
                logout(request)
                return self.handle_no_permission()
            return super(LogoutIfNotStaffMixin, self).dispatch(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

要使用它,请执行以下操作:

class AdminView(PermissionRequiredMixin, LogoutIfNotStaffMixin, TemplateView):
    permission_required = 'is_staff'
    template_name = 'checkout/admin.html'
Run Code Online (Sandbox Code Playgroud)

此 mixin 验证is_staff调度方法中的属性(User 类)(适用于POSTGET其他请求方法)。