如何在Django中向模型添加权限并使用shell对其进行测试

Kar*_*rek 9 python django django-models django-forms django-admin

我在我的模型中添加了Meta类并同步了DB,然后在shell中创建了一个返回false的对象,所以我真的无法理解错误的位置或缺少的是某些其他文件中可能存在某种配置.

class Employer(User):#Employer inherits from User
    employer_verified = models.BooleanField(default=False)

    class Meta:
        permissions = (
            ("is_member", "Friendly permission description"),
        )

emp = Employer.objects.create(blablabla)
emp.save()
emp.has_perm('myappname.is_member')
Run Code Online (Sandbox Code Playgroud)

dge*_*gel 19

在你给出的例子中,我希望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)
Run Code Online (Sandbox Code Playgroud)

要在shell中测试它,您可能需要删除为每个用户创建的权限缓存 - 否则has_perm可能无法反映实际权限:

delattr(emp, '_perm_cache')
Run Code Online (Sandbox Code Playgroud)

回答你的问题:

如果您希望每个Employer人都拥有is_member权限,可以选择以下几种方法:

  1. 重写save方法Employer以检查是否存在self.pk(这意味着它是一个新对象,并在保存后创建上面显示的权限.不是很漂亮,但它会起作用.

  2. 编写自己的身份验证后端.如果权限代码是'is_member'并且User有一个Employer实例,则返回True

  3. 不要使用权限.权限系统旨在让您能够动态授予和撤消权限.如果你只关心a是否UserEmployer- 那么测试.不要使用权限使其复杂化.