2017-05-27 18 views
0

私はDjangoアプリでプロフィール編集フォームを作成しましたが、データベースに保存しません。Djangoアプリでユーザープロフィールを更新できませんDjango

これは、プロファイルモデルです:

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile', primary_key=True) #Each User is related to only one User Profile 
    city_search_text = models.CharField(blank=True, max_length=300)#user picks a city from autocomplete and in the view I get or create a City object 
    city = models.ForeignKey(City, blank=True, null=True, related_name='city') #Each User Profile must be related to one city. 
    prof_pic = models.ImageField(blank=True, upload_to='profile_pictures') 
    dob = models.DateField(blank=True, null=True) 
    def __str__(self): 
     return self.user.first_name 

これは形式です:

class EditProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('dob',)#I'm testing to update this field only 

    def save(self, commit=True): 
     profile = super(EditProfileForm, self).save(commit=False) 

     if commit: 
      profile.save() 
     return profile 

これは図である。

def editprofile(request): 
    if request.method == 'POST': 
     edit_profile_form = EditProfileForm(request.POST, instance=request.user) 

     if edit_profile_form.is_valid(): 
      profile = edit_profile_form.save(commit=False) 
      profile.save() 

      if 'next' in request.GET: 
       return redirect(request.GET['next']) 
     else: 
      print (profile_form.errors) 
    else: 
     edit_profile_form = EditProfileForm(instance=request.user.profile) 

    return render(request, 'excurj/editprofile.html', {'edit_profile_form':edit_profile_form,}) 

私はそれが私を転送するフォームを送信した後、インデックスページは大丈夫ですが、値はユーザーのプロファイルで同じままです。

+1

オーバーライドされた 'save'メソッドは何も役に立ちません。削除する必要があります。また、ビューで 'commit = False'を実行する必要はありません。ただそれを直接保存してください。 –

答えて

0

はまったく呼び出さ取得されていない、とあなたのデータは保存されません

if edit_profile_form.is_valid(): 

のように思えます。つまり、フォームに無効なデータが含まれていることを意味し、フォームエラーを検出してそれらを検出する必要があります。

また、リクエストがPOSTでない場合は、フォームエラーを印刷しようとしています。これは意味をなさないので、フォームエラーの印刷には役立ちません。この方法で試してください。

if edit_profile_form.is_valid(): 
    profile = edit_profile_form.save(commit=False) 
    profile.save() 
else: 
    print (profile_form.errors) 

フォームのエラーを確認してください。

0

私はそれを最終的に考え出しました。ビューでは、Userオブジェクトではなくプロファイルのインスタンスを渡す必要があります。したがって、次のようにする必要があります。

edit_profile_form = EditProfileForm(request.POST, instance=request.user.*profile*) 
関連する問題