Django: ошибка целостности УНИКАЛЬНОЕ ограничение не выполнено: user_profile.user_id

Когда я пытаюсь отредактировать профиль для добавления информации в модель UserProfile, я получаю эту странную ошибку:

IntegrityError at /profiles/edit/
UNIQUE constraint failed: user_profile.user_id

Что здесь не так,

Модель:

class UserProfile(models.Model):

    user = models.OneToOneField(User)
    bio = models.TextField(blank=True)
    phone= models.CharField(max_length=10, blank=True)
    address = models.CharField(max_length=1024)
    age = models.PositiveIntegerField(blank=True,null=True)
    gender = models.IntegerField(choices=GENDER_CHOICES, default=1)

форма:

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = UserProfile
        fields = ('phone','age','gender','address','bio')

Вид:

def edit_profile(request):

    if request.method == 'POST':
        form = UserProfileForm(request.POST)
        print request.POST
        if form.is_valid():

            new_profile = UserProfile(
                            user = request.user,
                            bio = request.POST['bio'],
                            address = request.POST['address'],
                            age = request.POST['age']
                            )

            new_profile.save()

            return HttpResponseRedirect(reverse('user_public_profile', args=(request.user.username,)))
        return render(request,'users/edit_profile.html', {'form': form})

    else:
        form = UserProfileForm()
        return render(request,'users/edit_profile.html',
                          {'form': form})

Ответ 1

Это не странно. У вас уже есть профиль для этого пользователя, поэтому добавление другого нарушает уникальное ограничение. Вам нужно отредактировать существующую, а не добавить новую.

Также обратите внимание, что вы не используете очищенные данные формы при сохранении, каким вы должны быть. Либо используйте form.cleaned_data['bio'] и т.д., Либо еще лучше просто form.save(), который является целым рядом с использованием модельной формы.

Объединяя это:

try:
    profile = request.user.userprofile
except UserProfile.DoesNotExist:
    profile = UserProfile(user=request.user)

if request.method == 'POST':
    form = UserProfileForm(request.POST, instance=profile)
    if form.is_valid():
        form.save()
        return redirect...
else:
    form = UserProfileForm(instance=profile)
return render...

Ответ 2

Я получил ту же ошибку, затем я запускаю команду

python manage.py migrate --fake
python manage.py migrate

Ответ 3

Да, вы устанавливаете связь OneToOne между моделями User и UserProfile, поэтому вы сталкиваетесь с ошибкой целостности, для исправления которой вы можете изменить ее на ForeignKey Like:

class UserProfile(models.Model):

user = models.ForeignKey(User,on_delete=models.CASCADE)
bio = models.TextField(blank=True)
...
...