2016-03-27 16 views
1

私はこのページで作業しています。ユーザーは電話のような属性を編集できます。IntegrityError:App_userprofile.user_idがNULLでない可能性があります。

これらの属性は、組み込みユーザーモジュールまたはUserProfileuser = OneToOneField(User))のいずれかに格納できます。

私は更新用のカスタムフォームを作成しました。ユーザーがxxx/edit-profileに行くと、これらのフォームはuseruser.userprofileインスタンスで埋められます。問題がform.save()中に、エラーが発生していることを、私はこのフォームにすべてのフィールドが含まれていませんでしたから、次のとおりです。

フォーム:

IntegrityError: App_userprofile.user_id may not be NULL 

を明確にするために、私は、フォーム、モデルとビューを添付します:

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

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

ビュー:

@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}) 

MODEL:

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

おそらくデザインを再考する必要があります。あなたが望むフィールドを尋ねてカスタムユーザサブクラスを作成する方がずっと簡単です。 –

+0

@DanielRosemanあなたはUserProfileのやり方をやるほうがいいと思いますか?どのようにあなたがそれを意味するのかを私に見せていただければ幸いです。ありがとう –

+0

[カスタムユーザーモデルの置き換え](https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#substituting-a-custom-user-model)のドキュメントを参照してください。 –

答えて

0

解決策が見つかりました。私はこれが普通の方法ではないと思うが、それはうまくいく。要は、フォームを保存したければ、空のフィールド(IDなど)があります。

これらのフォームからデータ(辞書形式)を取得し、このデータを使用して現在のログユーザー属性を設定します。したがって、ユーザーは属性を保持し、フォームにある属性は変更されます。

 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() 
関連する問題