2012-04-12 5 views
3

я получил модель, описанную в моем Django приложения foo который выглядит следующим образом:Invalid опечатка при добавлении разрешения пользователя к объекту пользователя 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

Ничего себе. Это ужасно. Но он работает. Благодарю. –

+0

Да, как я уже сказал, вы, вероятно, захотите написать несколько хороших вспомогательных методов, которые работают так, как вы ожидали бы, что 'user_permissions.add' действительно будет работать. – dgel