Дизайнер разрешений Django is_staff

Я пытаюсь ограничить доступ к страницам, используя 2 пользовательских уровня. Суперпользователь и администратор. Суперпользователь является обычным пользователем Django с назначенным "is_superuser". Пользователь Admin также является обычным пользователем, которому назначено только разрешение 'is_staff'.

Проблема в том, что когда я использую этот декоратор для пользователя admin, он не проходит тест:

@permission_required('is_staff')
def my_view(....)

@permission_required('is_staff') возвращает false для анонимных пользователей. (Правильный)
@permission_required('is_superuser') возвращает true только для суперпользователей (правильно)
@permission_required('is_staff') возвращает FALSE для пользователей с назначенной переменной 'is_staff'. (Неправильно).

Любые мысли?

Ответ 1

is_staff не является разрешением, поэтому вместо permission_required вы можете использовать:

@user_passes_test(lambda u: u.is_staff)

или

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

@staff_member_required

Ответ 2

для классов, основанных на классах, вы можете добавить permission_required('is_staff') в urls.py:

from django.contrib.auth.decorators import permission_required

url(r'^your-url$', permission_required('is_staff')(YourView.as_view()), name='my-view'),

Ответ 3

ВНИМАНИЕ: после тщательной проверки этого решения не работает

В Django 1.10 работает работа @Николая Георгиева. В CBV вы можете использовать The PermissionRequiredMixin mixin

from django.contrib.auth.mixins import PermissionRequiredMixin
from django.http import HttpResponse

class MyView(PermissionRequiredMixin, View):
    permission_required = 'is_staff'

    def get(self, request):
        return HttpResponse('result')