同様の問題に直面して、私はそれが不可能であるという結論に達しました。
1ページに複数のフォームがあること自体がデザインミスであることが判明しましたが、さまざまな問題が発生しました。たとえば、ユーザーが2つのフォームに入力し、一方のフォームをクリックすると、もう一方のフォームからデータが失われます。回避策には、ページ上のすべてのフォームの状態を認識する必要がある複雑なコントローラーが必要です。(関連する問題に関するいくつかの議論については、ここも参照してください。)
ページごとに複数のフォームを用意することが正確な要件ではない場合は、別の解決策を検討することをお勧めします。
たとえば、通常、一度に1つの編集可能なフォームのみをユーザーに表示することができます。
私の場合、切り替えましたdjango-formwizard
(django.contribのものではなく、少し古く、現在再設計中のようですが、この1つの 更新: Djangoのリリース1.4から、django-formwizard
アプリはで利用可能になりdjango.contrib
、古いformwizardに置き換わります。すでにトランクにあります。ドキュメントを参照してください)。ユーザーにとっては、ページ上に実際には複数のフォームがあるように見せましたが、編集できるのは1つだけです。また、ユーザーは所定の順序でフォームに入力する必要がありました。これにより、複数のフォームの処理がはるかに簡単になりました。
そうでなければ、フォームを本当に一度に提示する必要がある場合は、それらを1つにまとめることが理にかなっている場合があります。
更新(説明後):
いいえ、ジェネリックを使用してフォームセットを処理することもできませんFormView
。あなたの例は実装が非常に簡単に見えますが、フォームセットのDjangoドキュメントのこの例と非常に似ていると思います。id
2つのフォームセットを処理し、1つをフォームに置き換えるだけです(要素の属性の衝突を避けるために、プレフィックスを指定する必要があると思います)。
要するに、あなたの場合、Django docsの上記の例と同様に、フォームとフォームセットを処理するためのサブクラスdjango.views.generic.base.View
とオーバーライドget()
、およびメソッドを使用します。post()
この場合、フォームとフォームセットの両方を編集可能に表示するのは問題ないと思います。ボタンを1つ押すだけで両方を送信できます。
別の更新:
Django tracにアクティブな最近のチケットがあります。#16256
より多くのクラスベースのビュー:フォームセットから派生したジェネリックビュー。すべてがうまくいけば、新しい汎用ビューがDjango:、およびFormSetsView
に追加されます。特に、最後の1つは、「インラインフォームセットを使用してモデルを表示および処理する方法を提供します」。ModelFormSetsView
InlineFormSetsView