65

I'm trying to prepopulate the data in my django form based on some information, but NOT using ModelForm, so I can't just set the instance.

This seems like it should be really easy, but for some reason I can't find any documentation telling me how to do this. This is my form:

class MyForm(forms.Form):
  charfield1 = forms.CharField(max_length=3)
  charfield2 = forms.CharField(max_length=3)
  choicefield = forms.ModelChoiceField(MyModel.objects.all())

I tried just doing:

form = MyForm()
form.charfield1 = "foo"
form.charfield2 = "bar"
# a model choice field
form.choicefield = MyModel.objects.get(id=3)

which does not work.

4

4 に答える 4

110

試す:

form = MyForm({'charfield1': 'foo', 'charfield2': 'bar'})

オブジェクトのコンストラクターはForm、フィールド値の辞書を取ることができます。これにより、バインドされたフォームが作成されます。これを使用して、データを検証し、データが表示された HTML としてフォームをレンダリングできます。詳細については、フォーム API のドキュメントを参照してください。

編集:

完全を期すために、フォームをバインドせず、一部のフィールドの初期値を宣言したいだけの場合は、代わりに次を使用できます。

form = MyForm(initial={'charfield1': 'foo', 'charfield2': 'bar'})

詳細については、初期値のドキュメントを参照してください。

于 2009-06-01T19:42:34.610 に答える
31

Django フォームに入力する方法は 2 つあります。

1 つ目は、辞書をインスタンス化するときに最初の引数として辞書を渡すことです (またはdata、同じことである kwarg として渡します)。これは、フォームに入力して検証するために POST データを使用する場合に行うことです。

data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3}
form = MyForm(data_dict)

ただし、これはフォームの検証をトリガーするため、最初に有効で完全なデータを実際に渡す場合にのみ機能します。そうしないと、エラーが発生します。

フォームに入力するもう 1 つの方法は、initialパラメーターを使用することです (ここに記載されています)。これにより、フォーム フィールドの初期値が提供されますが、検証はトリガーされません。したがって、たとえば、すべての値を入力しない場合に適しています。

form = MyForm(initial=data_dict)

を介して選択肢フィールドに入力するinitialには、pk 値を使用します。

于 2009-06-01T20:31:54.887 に答える
15

model_to_dict() を使用してインスタンスを辞書に変換し、それをフォームに入力できます。このようなものが動作するはずです:

from django.forms.models import model_to_dict
...
my_obj = MyModel.objects.get(abc=123)
form = MyForm(initial=model_to_dict(my_obj))

注:djangoバージョン1.3を使用しています

于 2013-02-20T01:52:21.670 に答える