Mawa Town

Mawaという人が作る小さな町でMawaTownです。技術と音楽が好き。

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保存はできるのに、この操作を書かないと保存できないフィールドがあったので、誰かの役に立つかもしれないと思い・・・