Userena - Расширение модели профиля до двух разных моделей - PullRequest
4 голосов
/ 21 января 2012

То, чего я пытаюсь достичь, - это то, что я хочу расширить модель профиля для учителя или ученика. В форме регистрации я добавил поле выбора, где пользователь выбирает, является ли он учителем или учеником. Ниже моя модель структуры.

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 ]

3 голосов
/ 21 января 2012

Как показывает ошибка, вы не можете создать 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()
2 голосов
/ 09 июля 2012

Я могу ошибаться, но почему вы подклассифицируете свои модели из модели профиля (так что у вас уже есть поле «пользователь»), и сразу после того, как у вас снова есть поле «профиль» OneToOneField для модели профиля?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...