2016-03-27 8 views
1

Ich arbeite auf der Seite, wo Benutzer einige seiner Attribute wie Telefon bearbeiten kann.IntegrityError: App_userprofile.user_id möglicherweise nicht NULL

Das Problem besteht darin, dass diese Attribute entweder im integrierten Benutzermodul oder in seiner UserProfile (user = OneToOneField(User)) gespeichert werden können.

Also habe ich benutzerdefinierte Formulare zum Aktualisieren erstellt. Wenn Benutzer zu xxx/edit-profile geht, werden diese Formulare von user und user.userprofile Instanzen gefüllt. Das Problem ist, da ich nicht alle Felder in dieser Form aufgenommen haben, dass während form.save() wird Fehler ausgelöst wird:

IntegrityError: App_userprofile.user_id may not be NULL 

klar sein, lege ich Formen, Modelle und Ausblick:

Forms:

class UserUpdateForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('last_name','first_name',) 

class UserProfileUpdateForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('telephone',) 

Ausblick:

@login_required 
def edit_user(request): 
    user = request.user 
    user_profile = user.userprofile 

    if request.method=='POST': 
     user_profile_update_form = UserProfileUpdateForm(request.POST) 
     user_update_form = UserUpdateForm(request.POST) 
     if user_profile_update_form.is_valid() and user_update_form.is_valid(): 

      user_update_form.save() 
      user_profile_update_form.save() 

      return render(request,'auth/profiles/my-profile.html') 
     else: 
      print user_profile_update_form.errors 
      print user_update_form.errors 
    else: 

     user_profile_update_form = UserProfileUpdateForm(instance=user_profile) 
     user_update_form = UserUpdateForm(instance=user) 
     return render(request,'auth/profiles/edit-profile.html', 
         context={'user_profile_update_form':user_profile_update_form, 
           'user_update_form':user_update_form}) 

MODELL:

class UserProfile(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='userprofile') 

    # ATRIBUTY KTORE BUDE MAT KAZDY 
    telephone = models.CharField(max_length=40,null=True) 

    HOW_DO_YOU_KNOW_ABOUT_US_CHOICES = (
      ('coincidence',u'It was coincidence'), 
      ('relative_or_friends','From my relatives or friends'), 
      ) 
    how_do_you_know_about_us = models.CharField(max_length=40, choices=HOW_DO_YOU_KNOW_ABOUT_US_CHOICES, null=True) 

    MARITAL_STATUS_CHOICES = (
     ('single','Single'), 
     ('married','Married'), 
     ('separated','Separated'), 
     ('divorced','Divorced'), 
     ('widowed','Widowed'), 
    ) 
    marital_status = models.CharField(max_length=40, choices=MARITAL_STATUS_CHOICES, null=True) 

    # OD KIAL STE SA O NAS DOZVEDELI 
    # A STAV 

    def __unicode__(self): 
     return '{} {}'.format(self.user.first_name,self.user.last_name) 

    def __str__(self): 
     return '{} {}'.format(self.user.first_name,self.user.last_name) 
+0

Sie sollten wahrscheinlich Ihr Design überdenken. Es ist viel einfacher, eine benutzerdefinierte Benutzerunterklasse mit den gewünschten Feldern zu erstellen. –

+0

@DanielRoseman Meinst du, dass es besser wäre, was UserProfile tun, aber anders? Ich würde mich freuen, wenn Sie mir zeigen, wie Sie das meinen. Danke –

+0

Siehe die Dokumentation zu [Ersetzen eines benutzerdefinierten Benutzermodells] (https://docs.djangoproject.com/de/1.9/topics/auth/customizing/#substituting-a-custom-user-model). –

Antwort

0

Ich fand eine Lösung. Ich nehme an, dass dies kein regulärer Weg ist, aber es funktioniert. Der Punkt ist, dass wenn ich Formulare speichern wollte, gab es leere Felder (zum Beispiel ID).

Also ziehe ich Daten (im Wörterbuchformat) aus diesen Formularen und setze die aktuell geloggten Benutzerattribute mit diesen Daten. So behält der Benutzer seine Attribute und diejenigen, die in Form waren, werden geändert.

 if user_profile_update_form.is_valid() and user_update_form.is_valid(): 

      for k, v in user_update_form.cleaned_data.iteritems(): 
       exec (u"user.{} = '{}'".format(k, v)) 
      for k, v in user_profile_update_form.cleaned_data.iteritems(): 
       exec (u"user.userprofile.{} = '{}'".format(k, v)) 
      user.save() 
      user_profile.save() 
Verwandte Themen