Django用户配置文件内联创建完整性错误保存

时间:2011-07-15 15:21:42

标签: django django-admin django-authentication

我目前在Django中遇到了一些用户配置文件问题。

我按照建议操作并创建了用户个人资料:

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    is_teacher = models.BooleanField(verbose_name = "Teacher", help_text = "Designates whether this user is a teacher and can administer and add students and classes")
    school = models.ForeignKey(School)

    def __unicode__(self):
        return self.user.username

    def save(self, *args, **kwargs):
        if not self.pk:
            try:
               p = UserProfile.objects.get(user=self.user)
               self.pk = p.pk
           except UserProfile.DoesNotExist:
               pass

        super(UserProfile, self).save(*args, **kwargs)

我还在用户管理页面中将此用户个人资料内联。这是我用来确保与用户一起创建用户配置文件的原因:

def create_user_profile(sender, instance, created, **kwargs):
"""Create the UserProfile when a new User is saved"""
    if created:
        print "User Profile Creation: ", created
        UserProfile.objects.get_or_create(user=instance)

当我添加新用户时会出现问题。在添加学校领域之前,我能够填补所有内容并且它会很有效。添加school字段后,我得到一个IntegrityError,指出userprofile.school_id不能为null。我在哪里错了?

我认为问题在于学校的选择没有传递给get_or_create,因此当它创建UserProfile时,它什么也看不见。当点击is_teacher的复选框时,它之前是如何工作的呢?另外,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

是的,学校的选择没有通过,它没有通过这里:

 UserProfile.objects.get_or_create(user=instance)

您只是设置用户,并尝试创建个人资料。

null=True, blank=True添加到学校领域,或找出学校的选择,并将其传递给:

 UserProfile.objects.get_or_create(user=instance, school=school)