formsetを使います。
ネット上では、forms.pyの中でフォームセットを作っているパターンの紹介が多いですが、今回はviews.pyの中でやります。
汎用性があるものは、forms.pyにまとめたり、クラス化したりするのが良いかと思います。
まず、forms.pyに普通のフォームを書きます。ModelFormを使います。
views.pyの中で、フォームセットを使いテンプレートにレンダリングします。処理が複雑になるので、クラスviewは使わず、関数viewで書きます。
保存時に一括でsave()がうまくいかない時は、transactionを使用し、フォームセットのPOST値をループで回してsave()するとできます。(本当はbulk_createを使いたかったのですがうまくいきませんでした。)
テンプレートは、ただフォームセットを埋め込むだけです。
参考サイト)
- https://bugsdb.com/_en/debug/0ea081ae2d1457cc7957f1dfeececfb9
- https://qiita.com/sand/items/9b9d5d0b3a189a05711f
- https://blog.narito.ninja/detail/30/#_9
- https://stackoverflow.com/questions/4271686/object-has-no-attribute-save-django
- https://stackoverflow.com/questions/16040493/save-a-formset-of-custom-forms-django/16054812
- https://qiita.com/qtatsunishiura/items/a6cc11e025aca1c16ed1
- https://teratail.com/questions/138985
- https://www.nblog09.com/w/2019/05/18/django-form-initial/