2014-10-30 10 views
11

Wenn ich ein Profil zu bearbeiten versuchen Informationen zu einem Userprofil Modell hinzufügen, ich diesen seltsamen Fehler bekommen:Django: Integritätsfehler UNIQUE fehlgeschlagen: user_profile.user_id

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

Was ist hier falsch,

Modell:

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) 

Form:

class UserProfileForm(forms.ModelForm): 

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

:

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

, um Ihr Problem nicht spezifisch, aber ich lief über den gleichen Fehler, wenn ich versehentlich Objektfelder auf einem 'ModelForm.save Änderung wurde (Commit = False)', oder es am wenigsten war damit verwandt, wie ich mit 'commit' umging. – jozxyqk

Antwort

12

Es ist nicht seltsam. Sie verfügen bereits über ein Profil für diesen Benutzer. Wenn Sie also ein anderes Profil hinzufügen, wird die eindeutige Einschränkung aufgehoben. Sie müssen die vorhandene bearbeiten, nicht eine neue hinzufügen.

Beachten Sie auch, dass Sie nicht die gesäuberten Formulardaten verwenden, wenn Sie speichern, was Sie sein sollten. Entweder verwenden Sie form.cleaned_data['bio'] etc, oder noch besser tun Sie einfach form.save(), was der ganze Sinn der Verwendung eines Modellformulars ist.

Putting, dass zusammen:

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... 
Verwandte Themen