7

我在我的 Django 应用程序中定义了一个模型foo,如下所示:

class Bar(models.Model):
    class Meta:
        permissions = (
            ("view_bar", "Can view bars"),
        )

我已经运行manage.py syncdb了这个,果然,它显示在auth_permissions表格中:

id|name|content_type_id|codename
41|Can view bars|12|view_bar

但是,当我尝试将该权限添加到视图中的用户对象时,如下所示:

request.user.user_permissions.add('foo.view_bar')

代码因以下异常而爆炸:

invalid literal for int() with base 10: 'foo.view_bar'

这是怎么回事?

4

1 回答 1

14

user_permissions.add正在添加到多对多管理器。所以你需要添加实际的 Permission 对象本身:

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(Bar)
permission = Permission.objects.get(content_type=content_type, codename='view_bar')

request.user.user_permissions.add(permission)

此外,您在测试时可能会感到奇怪,因为权限也会为每个用户缓存。您可能希望在调用之前删除缓存has_perm

if hasattr(user, '_perm_cache'):
    delattr(user, '_perm_cache')

一般来说,您可能想要编写一堆帮助方法来处理所有这些内容,以便您可以通过编程轻松地授予和撤销权限。你如何做到这一点实际上取决于你如何使用权限。

于 2012-04-12T20:44:41.220 回答