Existe um decorador no Django semelhante ao @login_required que também testa se o usuário é um superusuário?
obrigado
django
django-views
MadMaardigan
fonte
fonte
@staff_member_required
além de@user_passes_test
.Caso a associação da equipe seja suficiente e você não precise verificar se o usuário é um superusuário, você pode usar o
@staff_member_required
decorador:from django.contrib.admin.views.decorators import staff_member_required @staff_member_required def my_view(request): ...
fonte
Se você deseja ter uma funcionalidade semelhante a @staff_member_required, pode facilmente escrever seu próprio decorador. Tomando @staff_member como exemplo, podemos fazer algo assim:
from django.contrib.auth import REDIRECT_FIELD_NAME from django.contrib.admin.views.decorators import user_passes_test def superuser_required(view_func=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url='account_login_url'): """ Decorator for views that checks that the user is logged in and is a superuser, redirecting to the login page if necessary. """ actual_decorator = user_passes_test( lambda u: u.is_active and u.is_superuser, login_url=login_url, redirect_field_name=redirect_field_name ) if view_func: return actual_decorator(view_func) return actual_decorator
Este exemplo é um staff_member_required modificado, apenas mudou uma verificação em lambda.
fonte
from django.contrib.auth import REDIRECT_FIELD_NAME
Para visualizações baseadas em classe, criando um decorador reutilizável:
from django.contrib.auth.mixins import UserPassesTestMixin from django.views.generic import View def superuser_required(): def wrapper(wrapped): class WrappedClass(UserPassesTestMixin, wrapped): def test_func(self): return self.request.user.is_superuser return WrappedClass return wrapper @superuser_required() class MyClassBasedView(View): def get(self, request): # ...
fonte
se você tem seu perfil de usuário, você pode simplesmente fazer isso
@login_required @user_passes_test(lambda u: True if u.profile.role==2 else False ) def add_listing(request): #...
fonte
Eu recomendo usar Mixins, exemplo:
from django.contrib.auth.mixins import UserPassesTestMixin class SuperUserCheck(UserPassesTestMixin, View): def test_func(self): return self.request.user.is_superuser
Então você pode adicionar
SuperUserCheck
àView
classe:class MyView(SuperUserCheck, View):
fonte
Para exigir um superusuário em uma visão baseada em classe sem escrever um novo código:
from django.utils.decorators import method_decorator from django.contrib.auth.decorators import user_passes_test @method_decorator(user_passes_test(lambda u: u.is_superuser), name='dispatch') class AdminCreateUserView(LoginRequiredMixin, FormView): ... ... ...
fonte