はじめに
DjangoのFormクラスを活用することで、フォーム入力値のバリデーションを簡単に実装することが出来ます。
複雑なパターンや入力制限をカスタマイズしたい場合を除き、基本的な要素はデフォルトで用意された処理をフォームクラスで実装します。
よく利用する基礎的なバリデーションパターンを記述していきます。
1. バリデーションの実装方法
まずはテンプレートで画面に表示するHTMLを実装します。
<form action="{% url 'check' %}" method="post">
{% csrf_token %}
{{ form.as_table }}
<input type="submit" value="click">
</form>
ビューでフォームクラスを呼び出して、入力値のバリデーションの結果を元に処理を分岐出来させられます。
def check(request):
params = {
'form':CheckForm(),
}
# リクエストがPOSTの場合
if (request.method == 'POST'):
form = CheckForm(request.POST)
params['form'] = form
# バリデーションチェックの結果で分岐
if (form.is_valid()):
params['message'] = 'OK!'
else:
params['message'] = 'no good...'
return render(request, 'hello/check.html', params)
フォームクラスにてチェック処理を実装することで、ボタン押下時にバリデーションを追加することが出来ます。
2. バリデーションの種類
フォームには様々なプロパティを活用して、多様なバリデーションを実装することが出来ます。
バリデーションの種類とプロパティをいくつか紹介します。
2-1. テキスト入力フィールド
テキスト入力フィールドは、「CharField」を使用します。
-
required
⇒ 必要要素。Trueの場合は必須項目になる。 -
empty_value
⇒ 空の入力を許可。requiredとの違いは、「 」(スペース)の入力でエラーにならない点。
フォームクラスでの実装は以下のように行います。
class CheckForm(forms.Form):
find = forms.CharField(label='Find', required=False, \
widget=forms.TextInput(attrs={'class':'form-control'}))
2-2. 数値入力フィールド
数字を扱うフィールドは「IntegerField」を使用します。
以下のプロパティ
-
min_length, max_length
⇒ 入力するテキストの最小文字数、最大文字数を指定する。
class CheckForm(forms.Form):
requeired = forms.IntegerField(label='Requeired', \
widget=forms.NumberInput(attrs={'class':'form-control'}))
min = forms.IntegerField(label='Min', min_value=100, \
widget=forms.NumberInput(attrs={'class':'form-control'}))
max = forms.IntegerField(label='Max', max_value=1000, \
widget=forms.NumberInput(attrs={'class':'form-control'}))
2-3. 日時関連フォーマット
日時関連のバリデーションでは、「DateField」「TimeField」「DateTimeField」が利用出来ます。
前半で紹介した「required」といったプロパティも当然利用できます。
フォーマット | 意味 |
---|---|
%y | 年を表す数字 |
%m | 月を表す数字 |
%d | 日を表す数字 |
%H | 時を表す数字 |
%M | 分を表す数字 |
%S | 秒を表す数字 |
上記のテキストフォーマットを活用して、「2024-04-01」のような形式の指定が可能です。
フォームでは以下のように実装します。
class CheckForm(forms.Form):
date = forms.DateField(label="Date", input_formats=['%y/%m/%d'], \
widget=forms.DateInput(attrs={'class':'form-control'}))
time = forms.TimeField(label='Time', \
widget=forms.TimeInput(attrs={'class':'form-control'}))
※ ビューの「is_valid関数」で分岐した処理により、「no good...」が表示される。
おわりに
バリデーション機能の実装がDjangoではデフォルトで用意されているので、基本的な要素はあえてカスタムせずにフォーマットとプロパティを書くだけで判定処理が実装出来ます。便利だなぁ。
この他にも色々な要素が用意されているので、調べて実践してみようと思います。