Czy w django jest dekorator podobny do @login_required, który również sprawdza, czy użytkownik jest superużytkownikiem?
Dzięki
django
django-views
MadMaardigan
źródło
źródło
@staff_member_required
oprócz@user_passes_test
.Jeśli członkostwo personelu jest wystarczające i nie musisz sprawdzać, czy użytkownik jest superużytkownikiem, możesz użyć
@staff_member_required
dekoratora:from django.contrib.admin.views.decorators import staff_member_required @staff_member_required def my_view(request): ...
źródło
Jeśli chcesz mieć podobną funkcjonalność do @staff_member_required, możesz łatwo napisać własny dekorator. Biorąc jako przykład @staff_member, możemy zrobić coś takiego:
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
Ten przykład to zmodyfikowany staff_member_required, po prostu zmieniono jedno sprawdzenie lambda.
źródło
from django.contrib.auth import REDIRECT_FIELD_NAME
W przypadku widoków opartych na klasach tworzenie dekoratora wielokrotnego użytku:
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): # ...
źródło
jeśli masz swój profil użytkownika, możesz to po prostu zrobić
@login_required @user_passes_test(lambda u: True if u.profile.role==2 else False ) def add_listing(request): #...
źródło
Polecam używanie Mixinów, przykład:
from django.contrib.auth.mixins import UserPassesTestMixin class SuperUserCheck(UserPassesTestMixin, View): def test_func(self): return self.request.user.is_superuser
Następnie możesz dodać
SuperUserCheck
doView
zajęć:class MyView(SuperUserCheck, View):
źródło
Aby wymagać superużytkownika w widoku opartym na klasach bez pisania nowego kodu:
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): ... ... ...
źródło