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)
...
...