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