Djangoのformで何故か保存されないフィールドを保存する方法
普段のformの取扱の復習
Djangoのformで何故か保存されないフィールドが出る時がある。 普段は、例えばフィールドにインスタンスを保存する場合(ユーザーインスタンス等)は次のように処理すればいいのはリファレンスにもある(はず・・・)なので問題ない
仕様
django == 1.10
Python3
#クラスベースビューの場合(view関数でもほぼ同じ) class ExampleCreateView(CreateView): form_class = ExampleForm template_name = "example_template.html" success_url = '<url>' def form_valid(self, form): self.object = form.save(False) #form.save(False)にして・・・ self.object.user = self.request.user #リクエスト内の変数を入れ込んだり・・・ self.hogemodel_obj = Hogemodel.objects.get(id=1) #インスタンスを呼んでから、 self.object.hogemodel = self.hogemodel_obj #インスタンスを入れ込んだり・・・ self.object.fuga_char = "0" #特定の文字列を指定したり self.object.save() #save()すれば保存上記の指定したものはDBに保存される
上記で解決できない謎の症状
で、ここからが謎の症状なのだが、form.pyで指定して、フォーム上でも変数を入れ込んで保存できるようになっていて、上記のようなself.object.user = self.request.userではなくモデルフォームに入れ込むだけで保存されるはずのフィールドにフォームに入力した情報が保存がされない場合がある。
解決法
そんなときにはこうすると解決する!
#クラスベースビューの場合(view関数でもほぼ同じ) class ExampleCreateView(CreateView): form_class = ExampleForm template_name = "example_template.html" success_url = '<url>' def form_valid(self, form): self.object = form.save(False) #form.save(False)にして・・・ self.object.hozonshitai_foo_int = form.cleaned_data["hozonshitai_foo_int"] #↑フォームデータを呼び出してから、保存先を指定する #(本来は↑はやらなくてもいいはずなのだが、保存できない場合の対処) self.object.save() #save()すれば保存上記の指定したものはDBに保存される
これを実装しなくてもモデルフォームは、普段は指定したフィールドでインスタンスとかユーザーとか指定しないフィールドは、save()だけでDB保存はできるのに、この操作を書かないと保存できないフィールドがあったので、誰かの役に立つかもしれないと思い・・・