向Django用户对象添加用户权限时出现无效的文字错误

时间:2012-04-12 20:26:13

标签: django django-permissions

我在我的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'

发生了什么事?

1 个答案:

答案 0 :(得分:13)

user_permissions.add正在添加到ManyToMany管理器中。所以你需要添加实际的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')

通常,您可能希望编写一堆辅助方法来处理所有这些内容,以便您可以以编程方式轻松地授予和撤消权限。你如何这样做将取决于你如何使用权限。