web-dev-qa-db-ja.com

django 1つの送信ボタンで2つの異なるフォームを送信する

djangoの1つの送信ボタンで2つの異なるフォームを送信することは可能ですか? 「instrument」という1つのフォームと「config」という4つの同じフォームがあります。今、私は常に1つの構成と機器を提出したいと思います。例えばinstrument + config 1、instrument + config 2、およびすべてのconfigには独自の送信ボタンがあります。

私は設定フォームの1つのボタンでそれを試しました:

<input onclick="submitForms()" class="btn btn-primary cfg" type="submit" value="Start" >

そして、js関数 'onclick'を呼び出します。

submitForms = function(){
    console.log('ok'); //only for testing
    document.forms["firstForm"].submit();
    document.forms["secondForm"].submit();
}

これはviews.pyの私のメソッドです:

if request.method == 'POST':
        form1 = dataproviderInstrumentForm(request.POST)
        form2 = dynamicTimeseriesForm(request.POST)
        print(request.POST)
        if form1.is_valid() or form2.is_valid(): 
            # do some stuff

else:
    form1 = dataproviderInstrumentForm() # an unbound form
    form2 = dynamicTimeseriesForm() # an unbound form
27
user2412771

Htmlに複数の<form ..>タグを置く代わりに、<form>タグを1つだけ使用して、その下にあるすべてのフォームのフィールドを追加します。

テンプレートの例

<form >
    {{ form1.as_p }}
    {{ form2.as_p }}
    {{ form3.as_p }}
</form>

したがって、ユーザーがフォームを送信すると、すべてのフォームデータが表示され、ビューで行っていることを実行できます。なので

if request.method == 'POST':
        form1 = Form1(request.POST)
        form2 = Form2(request.POST)
        print(request.POST)
        if form1.is_valid() or form2.is_valid(): 

そのような場合は form prefix を使用することをお勧めします。

だからできる

if request.method == 'POST':
        form1 = Form1( request.POST,prefix="form1")
        form2 = Form2( request.POST,prefix="form2")
        print(request.POST)
        if form1.is_valid() or form2.is_valid(): 
else:
        form1 = Form1(prefix="form1")
        form2 = Form2(prefix="form2")
48
Rohan

@ Rohanの回答を拡張し、フォームにさらに制御を追加します。

依存しないフォーム/関係なし/複数のフォームから任意のフォームを保存

各フォームを個別に確認して、無効なフォームを確認してください。次に、エラーが含まれている場合はコンテキストに保存するか、それらをリダイレクトします。

if request.method == 'POST':
    form1 = Form1( request.POST,prefix="form1")
    form2 = Form2( request.POST,prefix="form2")

    if form1.is_valid():
       # save them    

       # context['form1_message'] = 'Form1 saved'
    else: 
       #save them into context
       context['form1']= form1

    if form2.is_valid():
       # save them    
       # context['form2_message'] = 'Form2 saved'
    else: 
       #save them into context
       context['form2']= form2

    if form1.is_valid() and  form2.is_valid(): 
       #that's mean both form is valid and saved successfully 
       return redirect('page')
    else:
        return render('/page', context)


else:
    form1 = Form1(prefix="form1")
    form2 = Form2(prefix="form2")

依存フォーム/モデルフォーム(1-1,1-m)/関係フォーム

親フォームに依存する1つの親フォームと1つの子フォーム。両方のフォームが同時に保存またはチェックされたエラーの場合、このメソッドを使用します。

if request.method == 'POST':
    form1 = Form1( request.POST,prefix="form1")
    form2 = Form2( request.POST,prefix="form2")

    if not form1.is_valid():
       #save them into context
       context['form1']= form1

    if not form2.is_valid():
       #save them into context
       context['form2']= form2

    if form1.is_valid() and  form2.is_valid(): 
       #that's mean both form is valid and saved successfully 
       return redirect('page')
    else:
        return render('/page', context)


else:
    form1 = Form1(prefix="form1")
    form2 = Form2(prefix="form2")