在您给出的示例中,我希望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方法(这意味着它是一个新对象,并在保存后创建我上面显示的权限。不是很漂亮,但它会工作。Employerself.pk
编写您自己的身份验证后端。如果权限码是'is_member'并且User有Employer实例,返回True
不要使用权限。权限系统旨在让您能够动态授予和撤销权限。如果您只关心 a 是否User是Employer- 然后测试它。不要通过使用权限使其复杂化。