我正在做一个博客项目,在这个项目中我添加了一个添加帖子,现在我希望只有超级用户才能添加帖子,并且该页面只对超级用户可见。
第一种方法
视图.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):
...
提前感谢,建议会有所帮助。
您可以使用UserPassesTestMixin
mixin[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