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



我正在做一个博客项目,在这个项目中我添加了一个添加帖子,现在我希望只有超级用户才能添加帖子,并且该页面只对超级用户可见。
第一种方法
视图.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

如何使用第一种方法获得相同的结果。我试过使用LoginRequiredMixin,但什么也没发生。我只是导入LoginRequiredMixin并像这样使用它。

class Addpost(CreateView,LoginRequiredMixin):
...

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

您可以使用UserPassesTestMixinmixin[Django-doc]:

from django.contrib.auth.mixins import UserPassesTestMixin
class AddPostView(UserPassesTestMixin, CreateView):
# …

def test_func(self):
return self.request.user.is_superuser

# …

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

from django.contrib.auth.mixins import UserPassesTestMixin
class AdminRequiredMixin(UserPassesTestMixin):
def test_func(self):
return self.request.user.is_superuser

然后使用这个混合物:

class AddPostView(AdminRequiredMixin, CreateView):
# …

def test_func(self):
return self.request.user.is_superuser

# …

Mixin应该放在继承层次结构中的实际视图之前:否则,它们会出现在方法解析顺序(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)

使用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

最新更新