2

У меня есть пара различных профилей. Я хочу связать разрешения с этими профилями. Я сделал так, как это:Django - разрешения и профили

class StudentProfile(UserProfile): 
    school = models.CharField(max_length=30) 
    class Meta: 
     permissions = (
      ("is_student","Can access student pages"), 
     ) 

Однако, когда я пытаюсь проверить, существует ли разрешение с помощью has_perm на этом профиле объекта, я получаю сообщение об ошибке «объект„StudentProfile“не имеет атрибута" has_perm»утра Я не должен проверять разрешения таким образом? Я читал документы, и именно так я и думал, что должен был сделать

Редактировать: После прочтения документов, похоже, что has_perm - это метод, принадлежащий Пользователям, а НЕ их профили. Однако, когда я пытаюсь показать разрешения:

print user.get_all_permissions() 

Я получаю пустой набор. Разве я не должен видеть что-то вроде «appname.is_student»

ответ

3

.has_perm - это метод на объекте User, а не на объекте UserProfile. Если вы пытаетесь проверить, что пользователь имеет разрешение has_student, вам нужно сделать что-то вроде этого:

user.has_perm('profiles.is_student') 

при условии, что ваша модель StudentProfile находится в profiles приложении.

EDIT: Для того, чтобы решить ваш перефразировать вопрос, вы должны назначить права доступа обычным способом, либо к группе или конкретному пользователю, и использовать User.has_perm. Ваш последний пример полностью противоречит точке разрешения системы Django.

+0

Хорошо спасибо. Я попробую сделать это «profile.is_student» и посмотреть, работает ли это – JPC

+0

. Он только присваивает разрешение, если я делаю это с помощью инструмента администрирования при редактировании отдельного пользователя. Когда пользователь регистрируется регулярно и профиль подключен, разрешение, определенное в метаклассе в профиле, не привязывается. print user.get_all_permissions() приводит к пустующему набору – JPC

+0

@ JPC: вам нужно либо назначить пользователя правильной группе, имеющей это разрешение, либо предоставить пользователю правильное разрешение непосредственно при регистрации. Если у вас есть собственный код обработки формы, вы можете сделать это после создания пользовательского объекта: 'user.permissions.add ('profiles.is_student')' или 'user.groups.add ('Student')' if группа 'Student' имеет разрешение' profiles.is_student'. –