2014-10-30 13 views
11

Kiedy próbuję edytować profil, aby dodać informacje do modelu UserProfile, otrzymuję ten dziwny błąd:Django: Integrity błąd UNIQUE failed: user_profile.user_id

IntegrityError at /profiles/edit/ 
UNIQUE constraint failed: user_profile.user_id 

Co jest nie tak tutaj,

Model

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) 

forma:

class UserProfileForm(forms.ModelForm): 

    class Meta: 
     model = UserProfile 
     fields = ('phone','age','gender','address','bio') 

widok:

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

Nie specyficzne dla danego problemu, ale natknąłem się tego samego błędu, kiedy przypadkowo zmieniając pola obiekt na 'ModelForm.save (commit = False)', lub przynajmniej go było związane z tym, jak obsługiwałem 'commit'. – jozxyqk

Odpowiedz

12

To nie jest dziwne. Masz już profil tego użytkownika, więc dodanie kolejnego zrywa wyjątkowe ograniczenie. Musisz edytować istniejący, a nie dodawać nowy.

Należy również pamiętać, że nie używasz czyszczonych danych formularza podczas zapisywania, co powinno być. Albo użyj form.cleaned_data['bio'] itd., Albo jeszcze lepiej po prostu form.save(), który jest cały punkt korzystania z formularza modelu.

Umieszczenie że razem:

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... 
Powiązane problemy