【问题标题】:Userena - Extending the Profile model further upto two different modelsUserena - 将 Profile 模型进一步扩展到两个不同的模型
【发布时间】:2012-01-20 23:28:51
【问题描述】:

我想要实现的是我想将配置文件模型进一步扩展到教师或学生。在注册表单中,我添加了一个选择字段,用户可以在其中选择他是老师还是学生。下面是我的模型结构。

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, “Column 'user_id' cannot be null”)”但我没有在这里创建新的用户实例我正在尝试将新创建的 profile_id 分配给教师或学生模型。我做错了??我该怎么办?

【问题讨论】:

    标签: python django


    【解决方案1】:

    正如错误所说,您无法在没有 user 的情况下创建 StudentTeacher,因为您已将其定义为不可为空的字段。

    确保您将您定义的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()
    

    【讨论】:

    • 我太笨了。有时这些小事会让你头疼。非常感谢朋友。 +1
    【解决方案2】:

    我可能错了,但是为什么你要从 Profile 模型子类化你的模型(所以你已经有了一个“用户”字段),并且在你再次为 Profile 模型拥有一个“个人资料”OneToOneField 字段之后?

    【讨论】:

      猜你喜欢
      • 2020-09-06
      • 2021-02-20
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多