向Django用户对象添加用户权限时出现无效的文字错误
我在Django应用程序向Django用户对象添加用户权限时出现无效的文字错误,django,django-permissions,Django,Django Permissions,我在Django应用程序foo中定义了一个模型,如下所示: class Bar(models.Model): class Meta: permissions = ( ("view_bar", "Can view bars"), ) 我已经对此运行了manage.py syncdb,果然,它显示在auth\u permissions表中: id|name|content_type_id|codename 41|Can view ba
foo
中定义了一个模型,如下所示:
class Bar(models.Model):
class Meta:
permissions = (
("view_bar", "Can view bars"),
)
我已经对此运行了manage.py syncdb
,果然,它显示在auth\u 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'
发生了什么事?
用户\u权限。“添加”
正在添加到多人管理器中。因此,您需要添加实际的权限对象本身:
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\u perm
之前,您可能需要删除缓存:
if hasattr(user, '_perm_cache'):
delattr(user, '_perm_cache')
通常,您可能希望编写一组帮助器方法来处理所有这些内容,以便可以通过编程轻松地授予和撤销权限。你如何做到这一点实际上取决于你如何使用权限。是的,就像我说的,你可能想编写一些很好的助手方法,就像你期望的
user\u权限那样工作。添加以实际工作。如果代码名
是唯一的,如果不获取内容类型
,您就不能获取权限
实例吗?例如,Permission.objects.get(codename='view\u bar')
似乎在我的情况下起作用。@djvg,codename
在所有模型中都不是唯一的,因此使用多条记录可能会失败found@MichaelNeylon:您是对的,codename
不一定是唯一的,这里也解释了这一点。我应该更加强调“如果”