Django是_员工权限装饰师

Django是_员工权限装饰师,django,permissions,admin,decorator,Django,Permissions,Admin,Decorator,我试图使用2个用户级别限制对页面的访问。超级用户和管理员。 超级用户是已分配“is_superuser”的常规Django用户。 管理员用户也是普通用户,仅分配了“is_staff”权限 问题是,当我为管理员用户使用此装饰器时,它没有通过测试: @permission_required('is_staff') def my_view(....) @permission\u required('is\u staff')对于匿名用户返回false。(正确) @permission\u requir

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

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

@permission_required('is_staff')
def my_view(....)
@permission\u required('is\u staff')
对于匿名用户返回false。(正确)
@permission\u required('is\u superuser')
仅对超级用户返回true(正确)
@permission\u required('is\u staff')
为已分配“is\u staff”perm的用户返回FALSE。(错)


有什么想法吗?

是\u员工
不是权限,因此您可以使用以下方法代替所需的
权限

@user_passes_test(lambda u: u.is_staff)


对于基于类的视图,您可以将
权限\u required('is\u staff')
添加到
url.py

from django.contrib.auth.decorators import permission_required

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

对于基于类的视图,使用

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

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


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

我应该注意,我使用的是Django 1.3和python 2.6.1,我添加了另一个更直观的选项(需要工作人员成员)。
@Permission\u required('is\u superuser'))
为超级用户返回
True
,因为
@permission\u required
始终为超级用户返回
True
,无论该权限是否存在(在本例中不存在)。这是假设您正在使用默认的身份验证后端。内置装饰程序“staff\u member\u required”很方便,但我会小心使用,因为它似乎没有正式的文档记录。@bjunix我想说,按照您的标准,
staff\u member\u required
现在可以安全使用了。我是通过手册“”页中的“请参阅”块找到它的。@ssoklow是的,你说得对,所需的
职员\u成员\u
装饰师现在已经有文档记录了:Lol几天后才找到我自己的答案。。。阿尔茨海默病的早期症状:德洛尔又遇到了:/我没有尝试,但我想知道“is_staff”是否如预期的那样在这里工作。
class ImportFilePostView(LoginRequiredMixin, UserPassesTestMixin):
  def test_func(self):
    return self.request.user.is_staff
  ...
import operator
from django.contrib.auth.decorators import user_passes_test

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