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

yay*_*ayu 16 django

当我尝试编辑配置文件以向UserProfile模型添加信息时,我收到这个奇怪的错误:

IntegrityError at /profiles/edit/
UNIQUE constraint failed: user_profile.user_id
Run Code Online (Sandbox Code Playgroud)

这里有什么问题,

模型:

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)
Run Code Online (Sandbox Code Playgroud)

形成:

class UserProfileForm(forms.ModelForm):

    class Meta:
        model = UserProfile
        fields = ('phone','age','gender','address','bio')
Run Code Online (Sandbox Code Playgroud)

视图:

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})
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 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...
Run Code Online (Sandbox Code Playgroud)


小智 5

我多次遇到相同的错误,我真的很沮丧,但最终还是找到了解决方案。

转变:

user = models.OneToOneField(User)
Run Code Online (Sandbox Code Playgroud)

user = models.ForiegnKey(User)
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题。