2014-10-30 110 views
11

当我试图编辑配置文件添加信息到用户配置模型,我得到这个奇怪的错误:Django的:失败完整性错误UNIQUE约束:user_profile.user_id

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

不具体到你的问题,但我遇到我的时候不小心被改变在'ModelForm.save对象字段(提交= FALSE)'同样的错误跑了,或者至少是与我如何处理'commit'有关。 – jozxyqk 2015-06-06 15:17:41

回答

12

这不奇怪。您已经拥有该用户的配置文件,因此添加另一个配置文件可以打破独特的限制。你需要编辑现有的,而不是添加一个新的。

另外请注意,当您保存时,您并未使用已清除的表单数据,您应该如此。要么使用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... 
相关问题