django @login_required декоратор для суперкористувача


86

Чи є в django декоратор, подібний до @login_required, який також перевіряє, чи користувач є суперкористувачем?

Дякую

Відповіді:


151

Використовуйте user_passes_testдекоратор:

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.is_superuser)
def my_view(request):
    ...

1
Як я можу це зробити в CBV?


Щоб переконатися, що користувач є активним користувачем, ви можете використовувати @staff_member_requiredдодатково до @user_passes_test.
phy25

75

Якщо кількість членів персоналу достатня і вам не потрібно перевіряти, чи є користувач суперкористувачем, ви можете скористатися @staff_member_requiredдекоратором:

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def my_view(request):
    ...

34
Коли я прийшов сюди, це те, що я шукав, тому і помістив його тут, і залишу тут, бо вважаю, що це може бути корисно комусь іншому.
Bit68

3
Це @ Bit68. Я його шукаю :)
Шив Шанкар

7

Якщо ви хочете мати подібні функції @staff_member_required, ви можете легко написати власний декоратор. Взявши @staff_member як приклад, ми можемо зробити щось подібне:

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

Цей приклад - модифікований staff_member_required, просто змінено одну перевірку в лямбда-програмі.


4
Вам також знадобиться ця заява про імпорт :) from django.contrib.auth import REDIRECT_FIELD_NAME
Брайан Тарплі,

3

Для переглядів на основі класу, створення декоратора багаторазового використання:

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):
        # ...

2

якщо у вас є профіль користувача, ви можете просто зробити це

@login_required
@user_passes_test(lambda u: True if u.profile.role==2 else False )
def add_listing(request):
    #...

1

Я рекомендую використовувати Mixins, приклад:

from django.contrib.auth.mixins import UserPassesTestMixin


class SuperUserCheck(UserPassesTestMixin, View):
    def test_func(self):
        return self.request.user.is_superuser

Потім ви можете додати SuperUserCheckдо Viewкласу:

class MyView(SuperUserCheck, View):

0

Щоб вимагати суперкористувача у поданні на основі класу без написання нового коду:

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):
    ...
    ...
    ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.