Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向Django用户对象添加用户权限时出现无效的文字错误_Django_Django Permissions - Fatal编程技术网

向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

我在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 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
不一定是唯一的,这里也解释了这一点。我应该更加强调“如果”