RSS

modelformset_factoryのこと

modelformset_factoryを作ってフォームの一括処理をしようとしたらどうも挙動がおかしい。

    付与されたタグ:
  • Django

ModelFormSetを作って新規のフォームを初期データ付きで作成しようとした。しかし新規にデータを挿入しているつもりなのに既存のデータが上書きされる。なぜだなぜだと考えていたがそもそもそういう挙動だった。

TheModelFormSet = modelformset_factory(TheModel)
print TheModelFormSet(inital=init_data)

だいたいこのような記述になるがほっておくとフォームの雛形をTheModel.objects.all() 相当から作ることになる。そこから初期値が、特にidが作成されてしまう。idがフォームのパラメータに含まれるということはinsertではなくてupdateの挙動になる。まいった。

完全にデータの入ってないフォームを作成しようと思ったらできる。例えばhttp://code.djangoproject.com/ticket/9538にあるようにすればできる。ただ、これにinitialを引数で与えるとエラーになる。initialはquerysetで作成したModelのインスタンスに対して適用しようとするので、当然数が合わずにエラー。initialのパラメータに {'id':None}を渡してやれば id が空のフォームはできるが必要のないquerysetを内部で実行することになる。それも気持が悪い。

自分でTheModelFormを作成してから TheModelFormSet を作成すればもちろん問題ないがめんどくさい。はてさて、簡単な方法がないものか。