2009-03-24 1 views
6

В моем приложении у меня есть студенты, преподаватели и сотрудники. Сотрудникам не нужен профиль, но преподаватели и ученики нуждаются в другом профиле. Я бы предпочел не реализовывать все это самостоятельно (промежуточное ПО и многое другое), так или иначе, чтобы get_profile() возвращал другой профиль в зависимости от роли пользователя?Каков наилучший способ иметь разные профили для разных пользователей в django?

ответ

7

С Django 1.1, который в настоящее время находится в стадии бета-тестирования, я бы использовал proxy model.

class MyUser(User): 

    class Meta: 
    proxy = True 

    def get_profile(self): 
    if self.role == 'professor': 
     return ProfessorProfile._default_manager.get(user_id__exakt=self.id) 
    elif self.role == 'student': 
     return StudentProfile._default_manager.get(user_id__exakt=self.id) 
    else: 
     # staff 
     return None 

get_profile нуждается в коде кеширования от оригинала и так далее. Но по существу вы могли бы сделать что-то подобное.

С Django 1.0.x вы можете реализовать производные классы на основе User, но это может сломать код в других местах. Для таких вещей мне нравятся прокси-классы, которые просто добавляют функциональность python без изменения моделей баз данных.

+0

Они выглядят полезными, но это по-прежнему представляет собой ту же самую проблему, что и у меня, с использованием нескольких типов пользователей/профилей: существующие приложения не знают об этом. Они просто создают экземпляры пользователя, поэтому этот хороший метод полностью игнорируется. – ironfroggy

+0

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

0

У вас рад http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles?

Это стандартное решение.

+2

Я прочитал это. Мне нужны разные профили для разных пользователей, это решение даст только один вид профиля для всех пользователей. –

+0

Пожалуйста, обновите свой вопрос на примере «разных профилей». Обычно мы определяем профили с несколькими полями, некоторые из которых являются необязательными. О чем ты говоришь? –