Django is_staff разрешение декоратора - PullRequest
50 голосов
/ 29 апреля 2011

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

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

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

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

Есть мысли?

Ответы [ 3 ]

103 голосов
/ 29 апреля 2011

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
7 голосов
/ 18 апреля 2018

Для представлений на основе классов удобно использовать UserPassesTestMixin , например,

class ImportFilePostView(LoginRequiredMixin, UserPassesTestMixin):
  def test_func(self):
    return self.request.user.is_staff
  ...
7 голосов
/ 24 июня 2014

для представлений на основе классов вы можете добавить 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'),
...