17

フォームに django 1.3 のクラス ベースのジェネリック ビューを使用したいのですが、複数のフォーム クラスを 1 つのフォームで管理する必要がある場合があります。ただし、FormMixin に基づく既存のビューは単一のフォーム クラスを想定しているようです。

これは一般的なビューで可能ですか?どうすればできますか?

編集: 明確にするために、フォームは 1 つですが、(ModelForm ベースの) クラスは複数あります。たとえば、django docs の inline_formset の例では、著者その本を一度に単一の形式で編集できるページを提示したいと思います。

author_form = AuthorForm(request.POST, instance = author)
books_formset = BookInlineFormSet(request.POST, request.FILES, instance=author)
4

3 に答える 3

11

同様の問題に直面して、私はそれが不可能であるという結論に達しました。

1ページに複数のフォームがあること自体がデザインミスであることが判明しましたが、さまざまな問題が発生しました。たとえば、ユーザーが2つのフォームに入力し、一方のフォームをクリックすると、もう一方のフォームからデータが失われます。回避策には、ページ上のすべてのフォームの状態を認識する必要がある複雑なコントローラーが必要です。(関連する問題に関するいくつかの議論については、ここも参照してください。)

ページごとに複数のフォームを用意することが正確な要件ではない場合は、別の解決策を検討することをお勧めします。

たとえば、通常、一度に1つの編集可能なフォームのみをユーザーに表示することができます。

私の場合、切り替えましたdjango-formwizarddjango.contribのものではなく、少し古く、現在再設計中のようですが、この1つの 更新: Djangoのリリース1.4から、django-formwizardアプリはで利用可能になりdjango.contrib、古いformwizardに置き換わります。すでにトランクにあります。ドキュメントを参照してください)。ユーザーにとっては、ページ上に実際には複数のフォームがあるように見せましたが、編集できるのは1つだけです。また、ユーザーは所定の順序でフォームに入力する必要がありました。これにより、複数のフォームの処理がはるかに簡単になりました。

そうでなければ、フォームを本当に一度に提示する必要がある場合は、それらを1つにまとめることが理にかなっている場合があります。


更新(説明後):

いいえ、ジェネリックを使用してフォームセットを処理することもできませんFormView。あなたの例は実装が非常に簡単に見えますが、フォームセットのDjangoドキュメントのこの例と非常に似ていると思います。id2つのフォームセットを処理し、1つをフォームに置き換えるだけです(要素の属性の衝突を避けるために、プレフィックスを指定する必要があると思います)。

要するに、あなたの場合、Django docsの上記の例と同様に、フォームとフォームセットを処理するためのサブクラスdjango.views.generic.base.Viewとオーバーライドget()、およびメソッドを使用します。post()

この場合、フォームとフォームセットの両方を編集可能に表示するのは問題ないと思います。ボタンを1つ押すだけで両方を送信できます。

別の更新:

Django tracにアクティブな最近のチケットがあります。#16256より多くのクラスベースのビュー:フォームセットから派生したジェネリックビュー。すべてがうまくいけば、新しい汎用ビューがDjango:、およびFormSetsViewに追加されます。特に、最後の1つは、「インラインフォームセットを使用してモデルを表示および処理する方法を提供します」。ModelFormSetsViewInlineFormSetsView

于 2011-06-08T11:51:20.400 に答える
2

django の原則の 1 つは、送信ボタンを 1 つだけ使用して、いくつかの小さなフォームから 1 つの大きなフォームを作成できることです。そのため、<form>-tags は django 自体によって生成されません。

クラスベースであろうとなかろうと、一般的なビュー、およびバックグラウンドでの複数のそのようなフォームの問題は、もちろん、空が限界であることです。フォームは何らかの形で関連している可能性があります。「マザー」フォームと、マザー内のデータに依存するオプションの追加データ (1 対 1 など)。次に、フォーム+フォームセットを使用する外部キーおよび/または中間テーブルを介して他のいくつかのモデルに接続されているモデルがあります。次に、リスト ビューでいくつかのフィールドを直接編集可能にするときの管理画面のように、すべてのフォームセットの種類のページがあります。これらはそれぞれ異なるタイプのマルチ フォーム ビューであり、すべてのケースをカバーする 1 つの汎用ビューを作成することは有益ではないと思います。

ただし、「マザー」モデルがある場合は、標準のUpdateViewor and を使用して、マザー モデルを処理するコードの後に​​ andCreateViewから呼び出される追加のフォームにメソッドを追加できます。たとえば、マザーフォームが有効な場合、他のフォームを処理できます。母親の pk を取得し、それを使用して他のフォームでデータを接続します。get()post()form_valid()

于 2013-05-11T16:24:43.993 に答える