Длинный ответ: p
Я нашел Пропущенное руководство Публикация неоценима для такого рода проблем, поскольку она объясняет многие особенности профилей django и систем регистрации django.
Я бы предложил использовать наследование нескольких таблиц для одного профиля, который вы можете установить через AUTH_PROFILE_MODULE
Например,
#models.py
class Profile(models.Model):
#add any common fields here (first_name, last_name and email come from User)
#perhaps add is_student or is_teacher properites here
@property
def is_student(self):
try:
self.student
return True
except Student.DoesNotExist:
return False
class Teacher(Profile):
#teacher fields
class Student(Profile):
#student fields
Django-Registration использует сигналы, чтобы уведомить вас о регистрации.В этот момент вы должны создать профиль, чтобы быть уверенным, что вызовы user.get_profile () всегда будут возвращать профиль.Используемый код сигнала:
#registration.signals.py
user_registered = Signal(providing_args=["user", "request"])
. Это означает, что при обработке этого сигнала у вас есть доступ к выполненному запросу.Поэтому, когда вы отправляете POST, форма регистрации включает поле, определяющее тип создаваемого пользователя.
#signals.py (in your project)
user_registered.connect(create_profile)
def create_profile(sender, instance, request, **kwargs):
from myapp.models import Profile, Teacher, Student
try:
user_type = request.POST['usertype'].lower()
if user_type == "teacher": #user .lower for case insensitive comparison
Teacher(user = instance).save()
elif user_type == "student":
Student(user = instance).save()
else:
Profile(user = instance).save() #Default create - might want to raise error instead
except KeyError:
Profile(user = instance).save() #Default create just a profile
Если вы хотите добавить что-либо в создаваемую модель, это не распространяется на значения полей по умолчанию, во время регистрации вы, очевидно, можете извлечь это из запроса.