Django is_staff权限装饰者

时间:2011-04-29 14:10:38

标签: django permissions admin decorator

我正在尝试使用2个用户级别限制对页面的访问。超级用户和管理员。 超级用户是指定了“is_superuser”的常规Django用户。 管理员用户也是普通用户,只分配了“is_staff”权限。

问题是当我为管理员用户使用这个装饰器时,它没有通过测试:

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

@permission_required('is_staff')为匿名用户返回false。 (正确)
@permission_required('is_superuser')仅对超级用户返回true(正确)
对于分配了“is_staff”perm的用户,@permission_required('is_staff')返回FALSE。 (错误的)。

有什么想法吗?

4 个答案:

答案 0 :(得分:99)

is_staff不是权限,因此您可以使用permission_required代替{/ p>

@user_passes_test(lambda u: u.is_staff)

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

@staff_member_required

答案 1 :(得分:8)

对于基于类的视图,您可以将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'),

答案 2 :(得分:5)

对于基于类的视图,UserPassesTestMixin很方便,例如

class ImportFilePostView(LoginRequiredMixin, UserPassesTestMixin):
  def test_func(self):
    return self.request.user.is_staff
  ...

答案 3 :(得分:0)

@arie 没有 lambda 的答案的一个变体,它可能会快一点(但我没有检查):

import operator
from django.contrib.auth.decorators import user_passes_test

@user_passes_test(operator.attrgetter('is_staff'))
def my_view(....)

话虽如此,我认为更好的方法是为您的视图创建一个 Permission 并将其与 permission_required 装饰器一起使用。