超级用户在基于 class 的视图中进行身份验证

superuser authenticate in class based view

我正在开发博客项目,其中我添加了一个添加 post,现在添加 post 我希望只有超级用户可以添加 post 并且该页面仅对超级用户可见.
第一种方法
Views.py

class AddPostView(CreateView):
    model = Post
    template_name = 'MainSite/add_post.html'
    fields = '__all__'

这是我目前的观点我可以使用第二种方法实现对超级用户的身份验证
第二种方法

class AddPostView(View):
    def get(self,request):
        if request.user.is_superuser == True:
            return render(...)
        else:
            pass

如何使用第一个 method.I 尝试使用 LoginRequiredMixin 获得相同的结果,但没有任何反应。我只是导入 LoginRequiredMixin 并像这样使用它。

class Addpost(CreateView,LoginRequiredMixin):
    ...

提前致谢,建议会有所帮助。

使用method_decorator和user_passes_test来实现

from django.views.generic import View
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import user_passes_test

class AddPostView(View):
    @method_decorator(user_passes_test(lambda u: u.is_superuser))
    def post(self, *args, **kwargs):
        pass

您可以使用 UserPassesTestMixin mixin [Django-doc]:

from django.contrib.auth.mixins import UserPassesTestMixin

class AddPostView(<strong>UserPassesTestMixin</strong>, CreateView):
    # …
    
    def test_func(self):
        return self.request.user<strong>.is_superuser</strong>
    
    # …

你可以将其封装在一个 mixin 中:

from django.contrib.auth.mixins import UserPassesTestMixin

class AdminRequiredMixin(UserPassesTestMixin):
    def test_func(self):
        return self.request.user.is_superuser

然后使用这个 mixin:

class AddPostView(<strong>AdminRequiredMixin</strong>, CreateView):
    # …
    
    def test_func(self):
        return self.request.user<strong>.is_superuser</strong>
    
    # …

Mixins 应该放在继承层次结构中的实际视图之前:否则它们会出现在 方法解析顺序 (MRO) 中的视图之后,因此可能不会覆盖行为(正确)。

class AddPostView(CreateView,LoginRequiredMixin):
    model = Post
    template_name = 'MainSite/add_post.html'
    fields = '__all__'
    def dispatch(self, request, *args, **kwargs):
        if request.user.is_anonymous:
           return redirect_to_login(self.request.get_full_path(), self.get_login_url(), self.get_redirect_field_name())
        elif request.user.is_superuser:
            return render(.....)
        else
            return super(AddPostView, self).dispatch(request, *args, **kwargs)