フォームで送信
index.html
にフォームを用意
hello/templates/hello/index.html
を修正し、簡単なフォームを用意する。
{% load static %} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>{{title}}</title> <link rel="stylesheet" href="{% static 'hello/css/style.css' %}" /> </head> <body> <h1>{{title}}</h1> <p>{{msg}}</p> <form action="{% url 'form' %}" method="post"> {% csrf_token %} <label for="msg">message: </label> <input id="msg" type="text" name="msg"> <input type="submit" value="click"> </form> </body> </html>
フォームの送信先
formタグの属性で
action="{% url 'form' %}"
とし、フォームの送信先を指定している。hello/urls.py
のurlpatterns
には、これに対応するname="form"
となるアドレスを追加する必要がある。
CSRF対策
{% csrf_token %}
でCSRF(Cross-Site Request Forgeries)対策用のトークンを自動的に表示するテンプレートタグ。
ビュー関数の作成
hello/views.py
を変更する。
def index(request): params = { 'title': 'Hello/Index', 'msg': 'お名前は?', } return render(request, 'hello/index.html', params) def form(request): msg = request.POST['msg'] params = { 'title': 'Hello/Form', 'msg': 'こんにちは、' + msg + 'さん。', } return render(request, 'hello/index.html', params)
index関数
が入口のアクセス、form関数
がフォーム送信を受け取った時の処理。
form関数
で、request.POST['msg']
とあるのがフォーム送信されたデータからキー'msg'の値を取り出す操作。HTML側の inputタグname="msg"
に対応したもの。
urlpatterns
の修正
hello/urls.py
のurlpatterns
を修正する。
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), path('form', views.form, name='form'), ]
表示結果
http://localhost:8000/hello/
にアクセスするとフォームが表示される
Hello/Index
お名前は?
フォームに名前、例えば'Foo'と入力してボタンクリックするとhttp://localhost:8000/hello/form
に飛び、次のように名前が入ったメッセージが表示される。
Hello/Form
こんにちは、Fooさん。
ただこのやり方の場合は、index
とform
という違うアドレスにアクセスしているので、フォームの入力内容を受けて表示された時には、フォームフィールドのユーザ入力値は消えてしまう。