2017-03-07 3 views
1

djangoフォームとクラスベースのビューを使用してuserprofileインスタンスを更新できません。 POSTリクエストは適切なパラメータで送信され、テンプレートは適切にリダイレクトされますが、残念ながらuserprofileは更新されません。クラスベースのビューとdjangoフォームを使用してデータを更新できません

私はDjangoを初めて使っているので、すべてのヒントを歓迎します。

models.py

class UserProfile(models.Model): 
    objects = models.Manager() 
    user = models.OneToOneField(User) 
    search_range = models.IntegerField(default=150) 

    def __str__(self): 
     return self.user.username 

forms.py

class HomeForm(forms.ModelForm): 

    class Meta: 
     model = UserProfile 
     fields = ('search_range',) 

views.py

class HomeView(TemplateView): 
    template_name = 'home/home.html' 

    def get(self, request): 
     form = HomeForm() 

     args = {'form': form} 
     return render(request, self.template_name, args) 

    def post(self, request): 
     form = HomeForm(request.POST, instance=request.user.userprofile) 
     if form.is_valid(): 
      form.save() 
      return redirect('home:home') 

     args = {'form': form} 
     return render(request, self.template_name, args) 

urls.py

urlpatterns = [ 
    url(r'^$', HomeView.as_view(), name='home') 
] 

はhome.html

<form method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit">Submit</button> 
</form> 
+2

コードが正しいように見えます。ユーザープロファイルが更新されていないことをどのように確認しましたか?あなたはデータベースで直接チェックしたのですか?また、ディスプレイの問題かもしれません。たとえば、 'instance'キーワード引数をフォームに' get'アクションで渡さないでください。だから、 'search_range'にはデフォルト値(' 150')があらかじめ設定されていると思います。 –

+0

@AntoinePinsardそうです、それはディスプレイの問題でした。私はデータがデータベースで正しく更新されていることに気付かなかった。 getメソッドのフォームにインスタンスを渡すことで問題が解決されました。どうもありがとうございました! –

答えて

1

あなたのコードはよさそうです。ユーザープロファイルは保存されている可能性がありますが、getメソッドのフォームにinstanceキーワード引数を渡さないため、search_rangeに既定値(150)があらかじめ入力されています。

def get(self, request): 
    form = HomeForm(instance=request.user.userprofile) 

    args = {'form': form} 
    return render(request, self.template_name, args) 
関連する問題