DjangoのFormは大変便利な機能を持っている。
ここでは、一番基本となるdjango.forms.Formの利用方法のまとめを記述した。
フォーム用のクラス(form.py)の作成とビュー・テンプレートの定義
- まず、form.pyをmodels.pyなどと同じ階層に作成して、django.forms.Formを継承したクラスを中に定義する。
from django import forms
class FormSample(forms.Form): # django.forms.Formを継承
name = forms.CharField(required=True) # requiredはフィールドの引数
email = forms.EmailField()
age = forms.IntegerField()
sex = forms.ChoiceField(choices=[
('item1', 'man'), ('item2', 'woman')
])
check = forms.BooleanField()
コードに記述した、CharField, EmailField, IntegerField, ChoiceField, BooleanFieldはフィールドと言ってフォームを構成している要素である。
- 次に、views.pyにてこのFormのオブジェクトを作成してテンプレートに渡す。
from django.shortcuts import render
from . import forms
def form_name_view(request):
form = forms.FormSample() # 定義したFormのオブジェクト作成
return render(request, 'basicapp/form_page.html', {'form': form}) # 作成したFormのオブジェクトをテンプレートに渡す
- 最後に、テンプレートでformを表示する。これには、form.as_pを利用するときれいに表示される(as_pについては、こちらの記事を参照)。
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <title>Forms</title>
</head>
<body>
<h1>Fill out the form!</h1>
<div class="container">
<form method="post">
<!-- actionを付けない場合は、元のviewのfunctionに返す -->
{{ form.as_p }}
<!-- formの表示 -->
{% csrf_token %}
<!-- クロスサイトリクエストフォージェリ対策、忘れずに -->
<input type="submit" class="btn btn-primary" value="Submit">
</form>
</div>
</body>
</html>
以上、formの画面表示について記述した。
ちなみに画面には以下のように表示される。
POSTメソッドで値を取り出す
- formで送信した値を取り出すには、簡単でviews.pyにif request.method=='POST':~~で処理を記載すればよい。
from django.shortcuts import render
from . import forms
def form_name_view(request):
form = forms.FormSample()
if request.method == 'POST': # POSTの時だけ処理する
form = forms.FormSample(request.POST) # POSTで送信した値をform変数に格納
if form.is_valid(): # formの値が正当な時(バリデーションチェックを走らせる)
print(type(form)) # <class 'basicapp.forms.FormSample'>
print(type(form.data['name']) # 名前に入力した値を取得できる(str)
return render(request, 'basicapp/form_page.html', {'form': form})
- formで送信した値を取り出す(記述方法2)
from django.shortcuts import render
from . import forms
def form_name_view(request):
form = forms.FormSample(request.POST or None) # POSTで送信した値をform変数に格納(POSTでない場合は空の値(None)でFormを初期化)
if form.is_valid(): # formの値が正当な時(バリデーションチェックを走らせる)
print(type(form)) # <class 'basicapp.forms.FormSample'>
print(type(form.data['name']) # 名前に入力した値を取得できる(str)
return render(request, 'basicapp/form_page.html', {'form': form})
以上で、最も基本的なformの使い方について説明を終えます。