web-dev-qa-db-ja.com

Djangoでフォーム送信ボタンの値にアクセスするにはどうすればよいですか?

Djangoプロジェクトがあり、1つのページに複数のフォーム(異なるタグで)があり、送信してさまざまな効果を得ることができます。すべての場合で、ユーザーを同じページなので、フォームを送信してから元のページにリダイレクトするパターンを自分のビューで使用しています。少なくとも1つのケースでは、2つのフォームの唯一の違いは送信ボタンの値です。

私のビューには、コードがあります(これは、ビュー関数がrequest.POSTに初めてアクセスするときです)。

if request.POST['submit']=='Add':
    #code to deal with the "Add" form

テンプレートの最初のフォームには、次のような送信ボタンがあります

<input type="submit" value="Add">

これでうまくいくと思いましたが、そのフォームを送信すると、上から見た行にエラーが表示されます。

キー「送信」が<QueryDict: {u'clientyear': [u'2012'], u'csrfmiddlewaretoken': [u'be1f2f051f09f6ab0375fdf76cf6a4d7'], u'ben': [u'123405']}>に見つかりません

明らかに、これには'submit'キーまたはクリックした送信ボタンに対応する値を持つキーがありません。では、これは機能しないので、送信ボタンの値にアクセスしたり、送信されたフォームを確認したりするにはどうすればよいですか?

21
murgatroid99

SubmitはHTMLフォーム構造です...次のようにフォームオブジェクトの名前属性を使用する必要があります...テンプレートで:

<form>
...
<input type="submit" name="list" value="List Objects" />
</form>
<form>
...
<input type="submit" name="do-something-else" value="Do Something Else" />
</form>

あなたの見解では:

if 'list' in request.POST:
    # do some listing...
Elif 'do-something-else' in request.POST:
    # do something else
31
FallenAngel

混乱を防ぐために心に留めておくべきことの1つ。フォームにボタンが1つしかない場合、送信ボタンのnameは表示されません。

#template.html
<form action="..." method="post">
<input type="submit" name = "first_button" value="Add">
</form>

#view.py
...
'first_button' in request.POST  #False

#template.html
<form action="..." method="post">
<input type="submit" name = "first_button" value="Add">
<input type="submit" name = "second_button" value="Remove">
</form>

#view.py
...
'first_button' in request.POST  #True if you clicked on that button

私は少し遅れましたが、ここが解決策です

直面している問題

あなたはボタン名を取得しようとしていますが、正しい方法ではないボタンの初期値を取得しています。

HTMLコード

<input type="submit" value="Add">

Pythonコード/View.py

if request.POST['submit']=='Add':
#code to deal with the "Add" form

ソリューション

最初にrequest.POST辞書でボタン名を見つけ、存在する場合はその値を取得します。

HTMLコード

ボタンの名前とその値を追加します。

<input type="submit" value="Add" name="add_object">

Views.py

ボタン名はrequest.POST辞書で確認できます

if request.POST['submit'] == 'add_object':
# Both ways to deal with it
if 'add_object' in request.POST:

追加のもの

ページには2つのフォームがあります。

最初のフォームには、同じ名前の2つのボタンsubjectsがありますが、異なる値fav_HTMLfav_CSSがあります。

2番目のフォームにも同じ名前の2つのボタンtutorialsがありますが、値は異なりますTutorials_HTMLTutorials_CSSです。

 <form action="" method="post">
      Form 1
      <button name="subject" type="submit" value="interview_HTML">HTML</button>
      <button name="subject" type="submit" value="interview_CSS">CSS</button>
 </form> 

<form action="" method="post">
      Form 2 
      <button name="tutorials" type="submit" value="Tutorials_HTML">HTML</button>
      <button name="tutorials" type="submit" value="Tutorials_CSS">CSS</button>
 </form> 

views.py

さまざまなフォームを処理し、どのボタンがクリックされたかを確認してから、それらの値を取得して何かを行うことができます。

if 'subject' in request.POST: # this section handle subject form (1st Form)
#now we can check which button is clicked 
# Form 1 is submitted , button value is subject now getting their value 

    if 'interview_HTML' == request.POST.get('subject'):
       pass 
       # do something with interview_HTML button is clicked
    Elif 'interview_CSS' == request.POST.get('subject'):
        pass
        # do something with interview_CSS button is clicked

Elif 'tutorials' in request.POST: #this section handle tutorials form (2nd form)

    #now we can check which button is clicked 
    # Form 1 is submitted , button name is tutorials now getting their value 

    if 'Tutorials_HTML' == request.POST.get('tutorials'):
        pass 
        # do something with fav_HTML button is clicked
    Elif 'Tutorials_CSS' == request.POST.get('tutorials'):
        pass
        # do something with fav_CSS button is clicked