はじめに
DjangoでWEBアプリを作っている時にform.pyやcontext_processors.pyという見慣れない名前のPythonファイルを作ったので調べてみました。
form.py
どのような(データ型の)フォームを作るのかを記述するファイル。
どのようなテーブルを作るのかを記述するmodel.py的なノリ。
Djangoから提供されるFormクラスを使うとバリデーションを簡単に実装することができるというメリットがある。
以下form.pyの例
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(max_length=1000)
sender = forms.EmailField()
このform.pyをviews.pyで引きつぐことでフォームを作る。
from django.shortcuts import render
from django.http.response import HttpResponse
from .forms import ContactForm #form.pyの引継ぎ
def index_template(request):
form = ContactForm()
return render(request, 'index.html', {'form': form})
HTMLファイルに{{ form }}
と記述することで、指定したデータ型のフォームを作ることができる。
<html>
<body>
<form>
{{ form }}
</form>
</body>
</html>
ページにアクセスすると入力フォームが完成している。
ところが、まだ入力された情報をサーバーに伝えることはできない。
これを実現するために、form
タグにaction
とmethod
を指定して送る場所と送る方法を記述する。さらに、送信するためにsubmit
ボタンを配置する。
ただし、同じviewで入力された情報を受け取るばあにはaction
は指定しなくてもよい。
<html>
<body>
<form action="" method="POST">
{% csrf_token %}
{{ form }}
<input type="submit" value="送信"/>
</form>
</body>
</html>
入力された情報の処理はviews.pyに記述する。
処理を追加したviews.pyは以下のようになる。
def form_test(request):
if request.method == "POST":
form = MyForm(data=request.POST) # ← 受け取ったPOSTデータを渡す
if form.is_valid(): #受け取ったデータの正当性確認
pass #正しいデータを受け取った場合の処理
else: #methodが'POST'ではない = 最初のページ表示時の処理
form = MyForm()
return render(request, 'polls/form.html', {
'form': form,
})
正しいデータを受け取った後はDBなどにデータを登録し、別ページにリダイレクトするなどの処理が行われる。
参考サイト
公式ドキュメント
DjangoBrothers-フォームの扱い方-
SamuraiBrog-formを作ってみよう-
Qiita-Djangoチュートリアル(5)-