【问题标题】:how to add Permissions in Django to Models and Test it using the shell如何将 Django 中的权限添加到模型并使用 shell 对其进行测试
【发布时间】:2012-05-02 09:35:01
【问题描述】:

我在模型中添加了 Meta 类并同步了数据库,然后在 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')

【问题讨论】:

    标签: python django django-models django-forms django-admin


    【解决方案1】:

    在您给出的示例中,我希望 emp.has_perm('myappname.is_member') 确实是 False。除非你明确地给新的Employer 对象is_member 权限,否则它不会拥有它。

    要以编程方式为其授予权限,您需要获取实际权限对象并将其添加到Employeruser_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 权限,有几个选项:

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

    2. 写你自己的authentication backend。如果权限码是'is_member',并且UserEmployer实例,返回True

    3. 不要使用权限。权限系统旨在让您能够动态授予和撤销权限。如果您只关心 User 是否是 Employer- 则对其进行测试。不要使用权限使其复杂化。

    【讨论】:

    • 好的,如果我只想将权限添加到模型,这意味着从该模型创建的每个对象都具有此权限,我应该在模型中做什么???对不起..但我很困惑
    • 权限不是这样工作的。添加is_member 权限并不意味着每个Employee 都会拥有该权限。这意味着任何Employee 都具有拥有该权限的选项
    • 优秀的答案。 +1 提到 delattr(emp, '_perm_cache'),我在玩 shell 权限时遇到了麻烦。
    • 还有一件事。如果您的用户实例从组继承权限,您还需要删除一个 _group_perm_cache 属性。使用 u = User.objects.get(username='username') 之类的东西简单地重新加载用户可能更容易,这就是 django.contrib.auth 中的测试所做的。
    猜你喜欢
    • 2017-12-10
    • 2016-12-29
    • 2018-08-29
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多