Django:完整性错误UNIQUE约束失败:user_profile.user_id

问题描述 投票:16回答:3

当我尝试编辑配置文件以向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})
django
3个回答
17
投票

这并不奇怪。您已经拥有该用户的个人资料,因此添加另一个用户会打破唯一约束。您需要编辑现有的,而不是添加新的。

另请注意,保存时,您不会使用已清理的表单数据。要么使用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...

0
投票

我得到了同样的错误,然后我运行命令

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

-1
投票

是的,你在User和UserProfile模型之间建立OneToOne关系,这就是你面临完整性错误的原因,为了解决这个问题,你可以将它改为ForeignKey,如:

class UserProfile(models.Model):

user = models.ForeignKey(User,on_delete=models.CASCADE)
bio = models.TextField(blank=True)
...
...
© www.soinside.com 2019 - 2024. All rights reserved.