概要
テンプレートのフォームで入力・送信されたデータをビューで受け取って処理する方法の基本。
ビュー関数/メソッドの引数(たとえばrequest
)のPOST
配列でフォームのINPUT
要素のname
属性値を指定して値を取得する。
request.POST['name属性値']
実装例
2つのページへのルーティング
urls.py
でinput
ページとresult
ページへのルーティングを設定。input
ページにフォームを置き、そこから送信されたデータをresult
ページで表示することとする。
DTLのurl
タグを使うため、各ルートにname
引数でルート名を付けている。
1 2 3 4 5 6 7 8 9 |
from django.urls import path from formtest import views app_name = 'formtest' urlpatterns = [ path('', views.input, name='input'), path('result', views.result, name='result'), ] |
inputページのためのビュー
ルート名formtest:input
でルーティングされるview
関数。単にinput.html
テンプレートをレンダリングしている。
1 2 3 4 |
from django.shortcuts import render def index(request): return render(request, 'formtest/input.html') |
input.htmlテンプレート
input.html
テンプレート。フォームには、text
タイプのINPUT
要素と、3つの選択肢を持つradio
タイプのINPUT
要素群が置かれている。
text
タイプのINPUT
要素のname
属性はinput_test
radio
タイプの3つのINPUT
要素のname
属性はradio_choice
で値はpine
、bamboo
、plum
送信ボタンが押されると、method
で指定したURLに飛ぶが、ここではurls.py
で定義したformtest:result
に飛ぶようにDTLのurl
タグを使っている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<h1>フォームテスト</h1> <form action="{{ url formtest:result }}" method="post"> {% csrf_token %} {# text #} <div> <input type="text" name="input_text" value=""> </div> {# radio #} <div> <label> <input type="radio" name="radio_choice" value="pine">松 </label> <label> <input type="radio" name="radio_choice" value="bamboo">竹 </label> <label> <input type="radio" name="radio_choice" value="plum">梅 </label> </div> <input type="submit" value="送信"> </form> |
resultビュー
フォームからの送信に対してviews.py
のresult
関数が呼ばれる。result.html
テンプレートにcontext
辞書を介して2つの変数input_text
とradio_choice
を渡している。
input_text
変数には、name='input_text'
で指定されたテキストの内容がrequest.POST['input_text']
で取得されて代入されるradio_choice
変数には、name='radio_choice'
で指定されたラジオボタンのうち選択されたもののvalue
値がrequest.POST[‘radio_choice’]で取得され、これに対応する文字列が代入される
1 2 3 4 5 6 7 8 9 10 11 12 |
from django.shortcuts import render def input(request): return render(request, 'formtest/index.html') def result(request): radio_result = { 'pine': '松', 'bamboo': '竹', 'plum': '梅' } context = { 'input_text': request.POST['input_text'], 'radio_choice': radio_result[request.POST['radio_choice']], } return render(request, 'formtest/result.html', context) |
result.htmlテンプレート
result
テンプレートでは、ビューのcontext
で設定された変数の内容を表示する。
1 2 3 4 5 6 7 8 9 10 |
<h1>送信結果</h1> <p> 入力されたテキストは"{{ input_text }}"です。 </p> <p> 選択されたのは"{{ radio_choice }}"です。 </p> <a href="{% url 'formtest:input' %}">フォームに戻る</a> |