Userena - Расширение модели профиля до двух разных моделей
То, чего я пытаюсь достичь, - это то, что я хочу расширить модель профиля для учителя или ученика. В форме регистрации я добавил поле выбора, где пользователь выбирает, является ли он учителем или учеником. Ниже моя модель структуры.
class Profile(UserenaLanguageBaseProfile):
""" Default profile """
GENDER_CHOICES = (
(1, _('Male')),
(2, _('Female')),
)
user = models.OneToOneField(User,
unique=True,
verbose_name=_('user'),
related_name='profile')
gender = models.PositiveSmallIntegerField(_('gender'),
choices=GENDER_CHOICES,
blank=True,
null=True)
class Teacher(Profile):
profile = models.OneToOneField(Profile,
unique=True,
verbose_name=_('profile'),
related_name='teacher')
home_address = models.CharField(_('home_address'), max_length=255, blank=True)
home_phone = models.CharField(_('home_phone'), max_length=30, blank=True)
cell_phone = models.CharField(_('cell_phone'), max_length=30, blank=True)
experience = models.IntegerField(default = 0)
summary = models.TextField(_('summary'), max_length=500, blank=True)
class Student(Profile):
profile = models.OneToOneField(Profile,
unique=True,
verbose_name=_('profile'),
related_name='student')
grade = models.CharField(_('grade'), max_length=50, blank=True)
Я перезаписываю метод сохранения регистрации как:
def save(self):
new_user = super(SignupFormExtra, self).save()
new_user.first_name = self.cleaned_data['first_name']
new_user.last_name = self.cleaned_data['last_name']
new_user.save()
if self.cleaned_data['teacher_or_student'] == 'teacher':
teacher = Teacher(profile = new_user.get_profile())
teacher.save()
elif self.cleaned_data['teacher_or_student'] == 'student':
student = Student(profile = new_user.get_profile())
student.save()
return new_user
Когда вызывается метод teacher.save() или student.save(), возникает ошибка целостности, которая "(1048, " столбец 'user_id' не может быть пустым ")", но я не создаю новый пользовательский экземпляр здесь, я пытаюсь назначить вновь созданный profile_id модели учителя или ученика. Я делаю не так?? что я должен делать?
2 ответа
Как говорит ошибка, вы не можете создать Student
или же Teacher
без user
как вы определили это как необнуляемое поле.
Убедитесь, что вы проходите свой класс new_user
вы определили..
# ...
new_user.save()
if self.cleaned_data['teacher_or_student'] == 'teacher':
teacher = Teacher(profile = new_user.get_profile(), user=new_user)
teacher.save()
elif self.cleaned_data['teacher_or_student'] == 'student':
student = Student(profile = new_user.get_profile(), user=new_user)
student.save()
Я могу ошибаться, но почему вы подклассифицируете свои модели из модели профиля (так что у вас уже есть поле "пользователь"), и сразу после того, как у вас снова есть поле "профиля" OneToOneField для модели профиля?