Профиль пользователя Django Ошибка целостности встроенного создания при сохранении - PullRequest
3 голосов
/ 15 июля 2011

В настоящее время у меня есть некоторые проблемы с профилями пользователей в 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)

Проблема возникает, когда я иду, чтобы добавить нового пользователя.Прежде чем добавить школьное поле, я смог заполнить все, и это будет прекрасно работать.После добавления школьного поля я получаю IntegrityError, в котором говорится, что userprofile.school_id не может быть нулевым.Где я тут ошибаюсь?

Я считаю, что проблема в том, что выбор школы не передается в get_or_create, поэтому при создании UserProfile ничего не видит.Как тогда это работало раньше, когда устанавливал флажок для is_teacher?Кроме того, как бы я исправить это?

1 Ответ

2 голосов
/ 25 февраля 2013

Да, выбор школы не принимается, здесь не проходит:

 UserProfile.objects.get_or_create(user=instance)

Вы только настраиваете пользователя и пытаетесь создать профиль.

Добавьте null=True, blank=True в поле школы или выясните, какой был выбор школы, и передайте это в:

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