Gibt es in django einen ähnlichen Dekorator wie @login_required, der auch testet, ob der Benutzer ein Superuser ist?
Vielen Dank
django
django-views
MadMaardigan
quelle
quelle
@staff_member_required
zusätzlich zu verwenden@user_passes_test
.Wenn die Mitarbeiterzahl ausreicht und Sie nicht überprüfen müssen, ob der Benutzer ein Superuser ist, können Sie den
@staff_member_required
Dekorator verwenden:from django.contrib.admin.views.decorators import staff_member_required @staff_member_required def my_view(request): ...
quelle
Wenn Sie ähnliche Funktionen wie @staff_member_required haben möchten, können Sie ganz einfach Ihren eigenen Dekorateur schreiben. Am Beispiel von @staff_member können wir so etwas tun:
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
Dieses Beispiel ist ein modifiziertes staff_member_required, nur eine Prüfung in Lambda geändert.
quelle
from django.contrib.auth import REDIRECT_FIELD_NAME
Erstellen Sie für klassenbasierte Ansichten einen wiederverwendbaren Dekorator:
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): # ...
quelle
Wenn Sie Ihr Benutzerprofil haben, können Sie dies einfach tun
@login_required @user_passes_test(lambda u: True if u.profile.role==2 else False ) def add_listing(request): #...
quelle
Ich empfehle die Verwendung von Mixins, Beispiel:
from django.contrib.auth.mixins import UserPassesTestMixin class SuperUserCheck(UserPassesTestMixin, View): def test_func(self): return self.request.user.is_superuser
Dann können Sie
SuperUserCheck
derView
Klasse hinzufügen :class MyView(SuperUserCheck, View):
quelle
So benötigen Sie einen Superuser für eine klassenbasierte Ansicht, ohne neuen Code zu schreiben:
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): ... ... ...
quelle