В моем приложении у меня есть студенты, преподаватели и сотрудники. Сотрудникам не нужен профиль, но преподаватели и ученики нуждаются в другом профиле. Я бы предпочел не реализовывать все это самостоятельно (промежуточное ПО и многое другое), так или иначе, чтобы get_profile() возвращал другой профиль в зависимости от роли пользователя?Каков наилучший способ иметь разные профили для разных пользователей в django?
ответ
С 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 без изменения моделей баз данных.
У вас рад http://docs.djangoproject.com/en/dev/topics/auth/#auth-profiles?
Это стандартное решение.
Я прочитал это. Мне нужны разные профили для разных пользователей, это решение даст только один вид профиля для всех пользователей. –
Пожалуйста, обновите свой вопрос на примере «разных профилей». Обычно мы определяем профили с несколькими полями, некоторые из которых являются необязательными. О чем ты говоришь? –
Они выглядят полезными, но это по-прежнему представляет собой ту же самую проблему, что и у меня, с использованием нескольких типов пользователей/профилей: существующие приложения не знают об этом. Они просто создают экземпляры пользователя, поэтому этот хороший метод полностью игнорируется. – ironfroggy
Да, несколько моделей пользователей по-прежнему несколько проблематичны, но различные профили, основанные на ролях, могут быть решены. –