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

时间:2014-10-30 11:23:04

标签: django

当我尝试编辑配置文件以向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})

5 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:4)

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

转换:

user = models.OneToOneField(User)

user = models.ForiegnKey(User)

这应该可以解决问题。

答案 2 :(得分:0)

我遇到相同的错误,然后运行命令

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

答案 3 :(得分:0)

在UserProfileForm(request.POST)中添加(实例= request.user)

答案 4 :(得分:-1)

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

class UserProfile(models.Model):

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