レポートの生成に使用されるクエリを制御するフィールド (開始日、終了日など) に Django フォーム (新しいフォーム) を使用する Web レポートがあります。私が抱えている問題は、フォームの初期値 (バインドされていない) を使用してページが機能するはずですが、を呼び出さない限り、cleaned_data フィールドにアクセスできないことis_valid()
です。ただしis_valid()
、バインドされていないフォームでは常に失敗します。
Django のフォームは、バインドされていないフォームが HTML を表示する以外には役に立たないように、データを編集するユースケースで設計されているようです。
たとえば、私が持っている場合:
if request.method == 'GET':
form = MyForm()
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
これが GET の場合 (バインドされていないため)、 is_valid() は失敗します。
if request.method == 'GET':
form = MyForm()
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
do_query への最初の呼び出しは、まだ呼び出されていないため有効なフィールドではない form.cleaned_data で例外をトリガーしますis_valid()
。次のようなことをしなければならないようです:
if request.method == 'GET':
form = MyForm()
do_query(form['start_date'].field.initial, form['end_date'].field.initial)
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
つまり、バインドされたフォームとバインドされていないフォームの間でフォームの値を取得するための共通のインターフェイスはありません。
これを行うためのよりクリーンな方法を見ている人はいますか?