2012-01-20 43 views
4

我想要实现的是我想将轮廓模型进一步扩展到教师或学生。在注册表格中,我添加了一个选择字段,供用户选择他是教师还是学生。以下是我的模型结构。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分配给教师或学生模型。我在做错误的方式?我该怎么办?

回答

3

由于错误提示您不能创建StudentTeacher而不是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() 
+0

我很愚蠢。有时这些小事让你头痛。非常感谢朋友。 +1 –

2

我可能是错的,但是你为什么从剖面模型的子类的模型(让你有一个“用户”字段已经存在),并且在您为Profile模型再次创建“配置文件”OneToOneField字段之后?

相关问题