2012-01-20 80 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字段之後?

相關問題