在您给出的示例中,我希望emp.has_perm('myappname.is_member')
确实是False
. 除非您明确授予新Employer
对象is_member
权限,否则它不会拥有它。
要以编程方式授予它您需要获取实际权限对象并将其添加到Employer
's 的权限user_permissions
:
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
content_type = ContentType.objects.get_for_model(Employer)
permission = Permission.objects.get(content_type=content_type, codename='is_member')
emp = Employer.objects.create(blablabla)
emp.save()
emp.user_permissions.add(permission)
要在 shell 中测试它,您可能需要删除为每个用户创建的权限缓存 - 否则has_perm
可能无法反映实际权限:
delattr(emp, '_perm_cache')
回答您的问题:
如果您希望每个Employer
人都获得is_member
许可,有几个选项:
覆盖检查是否没有的save
方法(这意味着它是一个新对象,并在保存后创建我上面显示的权限。不是很漂亮,但它会工作。Employer
self.pk
编写您自己的身份验证后端。如果权限码是'is_member'
并且User
有Employer
实例,返回True
不要使用权限。权限系统旨在让您能够动态授予和撤销权限。如果您只关心 a 是否User
是Employer
- 然后测试它。不要通过使用权限使其复杂化。