顧客向けの見積もりを作成する目的で、メイン フォームと 3 つのインライン forsets をすべて 1 つの HTML ページに配置しています。「メイン」フォームの主キーは、3 つのインライン フォームセットすべての外部キーとして使用されます。新しい見積もりの作成、保存、データの変更などを行うことができます。問題ありません。ただし、必要なデータがすべて存在し、「有効」である場合にのみ機能します。
すべてのデータが入力された状態で HTML ページを再表示し、適切な場所にエラーが表示されるようにするにはどうすればよいですか?
私の状況をさらに説明するために、単一の単純なフォームの通常の方法は次のようなものです (これは私の頭の中から外れているので、コード エラーがないことを願っています)。
if request.method=='POST':
myform = Model_Form(request.POST)
if myform.is_valid():
myform.save()
...
return HttpResponseredirect(...)
else:
myform = new form from model etc...
return render_to_respose(template.html, {'myform':myform}, context_instance=RequestContext(request))
上記で、検証エラーがある場合、適切なフィールドの横にいくつかのエラーがあり、ユーザーが既に送信したデータでフォームが再表示されます。
インライン フォームセットでは、次のようなことを行います ( myForm
PK がありmyInline
、外部キーを介してその PK を使用すると仮定します)。
if request.method=='POST':
myform = Model_Form(request.POST)
if myform.is_valid():
tmp = myform.save(commit=False)
myInline = inlineFormset(request.POST, instance=tmp)
if myInline.is_valid():
myInline.save()
myform.save()
return HttpResponseRedirect(...)
else:
myform = new form from model etc...
myInline = new inline formset from model etc...
return render_to_respose(template.html, {'myform':myform, 'myInline':myInline}, context_instance=RequestContext(request))
したがって、上記のコードでは、 内myForm
で検証エラーが発生した場合、ステートメントをドロップアウトしif
、フォームを再表示してエラーを表示します。ただし、インライン フォーム (行) はまだ作成されていません。これは、有効性を確認した後にmyInline = inlineFormset(request.POST, instance=tmp)
そのステップが発生し、エラーなどが発生するためです。myForm
myInline Referenced before assignment
これに対抗するために、行を移動してみました:
tmp = myform.save(commit=False)
myInline = inlineFormset(request.POST, instance=tmp)
が有効かどうかを確認する前にmyForm
、インライン フォームの POST データをキャプチャできるようにします。myForm
しかし、有効かどうかを確認していないため、それはできません。
ニワトリと卵。うーん!
では、ユーザーが入力したインライン フォームセットのコンテンツを再表示しながら、フォームの入力エラーを検証して表示するにはどうすればよいでしょうか。
長い投稿で申し訳ありませんが、質問を短くする方法がわかりません。
編集:
myForm
メインフォームの検証エラーを表示し、すべてのmyForm
フィールドとフォームセットフィールドを再表示する方法を見つけましたmyInline
。こんなふうになります:
if request.method=='POST':
myform = Model_Form(request.POST)
if myform.is_valid():
tmp = myform.save(commit=False)
myInline = inlineFormset(request.POST, instance=tmp)
if myInline.is_valid():
myInline.save()
myform.save()
return HttpResponseRedirect(...)
myInline = inlineFormset(request.POST)
else:
myform = new form from model etc...
myInline = new inline formset from model etc...
return render_to_respose(template.html, {'myform':myform, 'myInline':myInline}, context_instance=RequestContext(request))
メインステートメントmyInline
から出る前に、新しい割り当てに忍び込むだけです。if
うまくいけば、これは同じ問題を抱えている他の人に役立ちます。
乾杯!