2012-04-12 64 views
3

我有我的Django应用程序foo定义的模型,看起来像这样的时候:无效的文字错误添加用户权限一个Django用户对象

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' 

这是怎么回事?

回答

8

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

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') 

在一般情况下,你可能想要写一堆是照顾所有的这些东西,所以你可以给方便地编程撤消权限的辅助方法。你如何这样做将取决于你如何使用权限。

+1

哇。这很可怕。但它的工作。谢谢。 – 2012-04-12 20:49:30

+0

是的,就像我说的,你可能想写一些很好的帮助方法,就像你期望'user_permissions.add'实际工作一样。 – dgel 2012-04-12 20:50:34