概要
テンプレートのフォームで入力・送信されたデータをビューで受け取って処理する方法の基本。
ビュー関数/メソッドの引数(たとえば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_testradioタイプの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> |