web-dev-qa-db-ja.com

Djangoフォーム送信でクリックされた送信ボタンを特定する

In Django「保存してホーム」と「保存して次へ」の2つの送信ボタンオプションがあるフォームが欲しいのですが。

ビューでクリックされた送信ボタンを特定する方法について何か考えはありますか?

私はフォームのプログラミング/操作にかなり慣れていないので、フィードバックに感謝します。

フォーム

<form action="{% url 'price_assessment_section_1' component.id %}" method="post"> {% csrf_token %}

 {{ form.s1_q5_resin_type }}

 <!-- FORM SUBMIT BUTTONS-->

 <button type="submit" >&nbsp;Save&Home</button>

 <button type="submit" >&nbsp;Save&Next</button>

</form> <!-- end form-->

表示

@login_required
def price_assessment_section_1(request, component_id):

    component = Component.objects.get(id=component_id)

    if request.method == 'POST':
        form = PriceAssessmentSection1(request.POST)

                # if "save & home" go to: return HttpResponseRedirect(reverse('portal_home'))

                # if "save & next" go to: return HttpResponseRedirect(reverse('portal_sec2'))

    form = PriceAssessmentSection1()
    return render(request, 'portal/price_assessment_section_1.html', {'form': form, 'component':component})
17
bbrooke

あなたは彼らに名前を付けることができます。クリックされたボタンのみが送信でデータを送信します。テンプレートで適切な名前を付けます。

<button type="submit" name="save_home" value="Save&Home">&nbsp;Save&Home</button>
<button type="submit" name="save_next" value="Save&Next">&nbsp;Save&Next</button>

また、関連セクションのビューでは、名前をチェックすることで、どのボタンがクリックされたかを確認できます。

if request.method == 'POST':
    form = PriceAssessmentSection1(request.POST)
    if request.POST.get("save_home"):
        return HttpResponseRedirect(reverse('portal_home'))
    Elif request.POST.get("save_next"):  # You can use else in here too if there is only 2 submit types.
        return HttpResponseRedirect(reverse('portal_sec2'))
33
FallenAngel

Django 2.xでは、ビューメソッド@FallenAngelの回答にわずかな変更があります

if request.method == 'POST':
    form = PriceAssessmentSection1(request.POST)
    # Note change below
    if 'save_home' in request.POST:
        return HttpResponseRedirect(reverse('portal_home'))
    # Note change below
    Elif 'save_next' in request.POST:  # You can use else in here too if there is only 2 submit types.
        return HttpResponseRedirect(reverse('portal_sec2'))
2
mb_atx