¿Hay un decorador en django similar a @login_required que también prueba si el usuario es un superusuario?
Gracias
django
django-views
MadMaardigan
fuente
fuente
@staff_member_required
además de@user_passes_test
.En caso de que la membresía del personal sea suficiente y no necesite verificar si el usuario es un superusuario, puede usar el
@staff_member_required
decorador:from django.contrib.admin.views.decorators import staff_member_required @staff_member_required def my_view(request): ...
fuente
Si desea tener una funcionalidad similar a @staff_member_required, puede escribir fácilmente su propio decorador. Tomando @staff_member como ejemplo, podemos hacer algo como esto:
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 ejemplo es un staff_member_required modificado, solo cambió una verificación en lambda.
fuente
from django.contrib.auth import REDIRECT_FIELD_NAME
Para vistas basadas en clases, crear un decorador reutilizable:
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): # ...
fuente
si tienes tu perfil de usuario simplemente puedes hacer esto
@login_required @user_passes_test(lambda u: True if u.profile.role==2 else False ) def add_listing(request): #...
fuente
Recomiendo usar Mixins, ejemplo:
from django.contrib.auth.mixins import UserPassesTestMixin class SuperUserCheck(UserPassesTestMixin, View): def test_func(self): return self.request.user.is_superuser
Entonces puedes agregar
SuperUserCheck
a laView
clase:class MyView(SuperUserCheck, View):
fuente
Para requerir un superusuario en una vista basada en clases sin escribir código nuevo:
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): ... ... ...
fuente