0

私は非常に複雑なフォームを持っていますがModelForm、フィールドの柔軟性と制御が必要だったため、使用しないことを選択しました。私はを使用していないので、、ModelFormのようなことを単純に行うことはできません。instance=orderorder = Order.objects.get(pk=1)

現在、私はこのようなものとは反対にinitial、すべてのフィールドに事前入力していますforms.pyviews.py

self.fields['work_type'] = forms.ChoiceField(choices=Order.WORK_TYPE_CHOICES, initial=order.work_type)

しかし、オブジェクト全体をフォームに渡すことができるのか、それともすべてのフィールドorderに宣言する必要があるのか​​、疑問に思っていましinitialた。

次のようなことをする方法はありますか

order_form = OrderEditForm(data=request.POST, initial=order)

views.py

4

3 に答える 3

1

私は非常に複雑なフォームを持っていますが、フィールドの柔軟性と制御が必要だったため、ModelFormを使用しないことを選択しました

フォームを使用して実行できることはすべて、新しいフィールドの追加やフィールドの属性のオーバーライドなど、ModelFormで実行できます。

しかし、注文オブジェクト全体をフォームに渡すことができるのか、それともすべてのフィールドにイニシャルを宣言する必要があるのか​​疑問に思いました。

注文オブジェクトをフォームに渡すことはできますが、フォームまたはビュー関数のいずれかで各フィールドに個別に入力する必要があります。

したがって、あなたの見解では、次のようなことをします。

intial = {'order_number': order.number, 'order_id': order.id}

form = OrderForm(initial=initial)
于 2012-05-22T03:05:25.423 に答える
1

データをフォームに事前入力する最も簡単な方法は、deformコンストラクターへの最初の引数として辞書を渡すことです。

order_form = OrderEditForm(order.__dict__())

ここ__dict__()で、は「order」オブジェクト属性を、各属性の名前をキーとして、その内容を値としてディクショナリに渡すメソッドです。

このような方法を「発明」する方法の例は、次のようになります。

order_initial = Order.objects.filter(pk=order.pk).values()[0]

次に、次のコマンドを使用してフォームを作成します。

order_form = OrderEditForm(order_initial)

この例を見てください(「投稿」時に値を設定する方法):

于 2012-05-22T03:07:32.943 に答える
0

他の人への将来の参照のために:

それ以来、SOのコメントと回答を読んだ後、ModelFormすべてのフィールドを手動で明示的に定義することになった場合でも(のようなものを使用してself.fields['foo'] = forms.CharField())使用する方がよいことがわかりました。

いずれにせよ、現在の値のディクショナリをフォームで渡そうとしている場合、モデルをディクショナリに変換するための最良の(組み込みの)方法は、実際には以下を使用することmodel_to_dictです。

from django.forms.models import model_to_dict

order = Order.objects.get(pk=1)
dictionary = model_to_dict(order)
form = OrderEditForm(dictionary)

私はこのブログから解決策を得ました。これが誰かに役立つことを願っています。

于 2012-05-26T11:49:14.877 に答える