我正在尝试使用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。 (错误的)。
有什么想法吗?
答案 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
装饰器一起使用。