2012-04-12 63 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