2014-10-30 106 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... 
相關問題