3

顧客向けの見積もりを作成する目的で、メイン フォームと 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))

上記で、検証エラーがある場合、適切なフィールドの横にいくつかのエラーがあり、ユーザーが既に送信したデータでフォームが再表示されます。

インライン フォームセットでは、次のようなことを行います ( myFormPK があり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)そのステップが発生し、エラーなどが発生するためです。myFormmyInline 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

うまくいけば、これは同じ問題を抱えている他の人に役立ちます。

乾杯!

4

1 に答える 1

1

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

うまくいけば、これは同じ問題を抱えている他の人に役立ちます。

乾杯!

于 2011-06-19T20:55:38.287 に答える