在刚刚使用django-admin startproject
和./manage.py startapp
创建的Django项目和应用程序中,我创建了以下模型:
class Book(models.Model):
author = models.CharField(max_length=50)
然后我用./manage.py shell
运行此代码:
from django.contrib.auth.models import Permission, User
from django.test import TestCase
from myapp.models import Book
myuser = User.objects.create_user(username="myuser")
myuser.user_permissions.add(Permission.objects.get(codename="change_book"))
mybook = Book(author="Joe Author")
mybook.save()
myuser.has_perm("myapp.change_book")) # The result is True
myuser.has_perm("myapp.change_book", mybook)) # The result is False
这是为什么?用户 有权编辑mybook
,不是吗? has_perm()
应该如何工作?在某处有记录吗?
答案 0 :(得分:2)
has_perm()
API旨在与模型级权限(第二个参数为None
)和对象级权限一起使用。但是,要由authentication backends个人来决定要支持什么。
对于Django默认的ModelBackend
,有no support for object-level permissions:
Django的权限框架为对象权限奠定了基础,尽管其核心没有实现。这意味着检查对象权限将始终返回
False
。
ModelBackend
documentation中也对此有所说明。
请注意,后端必须在此处返回False
,因为从本质上来说,各个后端的结果都经过“或”运算。如果此后端返回了True
,就不可能尊重其他后端的更精细的结果。
有 个后端实现了对象级权限,django-guardian也许是最著名的。看看它如何记录has_perm()
:
Django的
ModelBackend
之间的主要区别是我们可以在此处传递obj
实例。