Djangoでバリデーションの実装について
カテゴリ:Pythonの話
こんにちは!伊神です!
今回はDjangoでバリデーション機能を実装する方法をご紹介します。
バリデーション機能を実装するのに、いくつか方法がある中の「form.py」「view.py」で実装しようと思います。
また、弊社ではWebプロモーション成功事例集をまとめた限定資料を無料で配布しています。
Webマーケティングに興味がある方は、下記ページより目を通してみてください。
バリデーションとは
バリデーション(validation)とは、「入力チェック」のことです。
「ログイン」や「新規登録」などによく用いられており、「ログイン」なら登録された情報とあっているかどうかをチェックし、「新規登録」だったら入力形式があっているかどうかなどをチェックしています。
バリデーションのことについてわかりやすく解説しているサイトがありましたので、よかったら見てみてください。
▼「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
https://wa3.i-3-i.info/word11610.html
またwebで集客する方法を別の記事にまとめております。
詳しく解説しているので、web集客について深く知りたい方は、ぜひこちらもご覧ください。
Djangoの場合どうバリデーションを実装するか
バリデーション機能の実装に今回は
- 入力チェックの設定値やエラー時のメッセージを記載する「forms.py」
- バリデーションのチェックをして正常な入力値なら保存処理を行う「views.py」
- 表示のテンプレートとなる「user.html」
を編集します。
formクラス
sampleapp/forms.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from django import forms from django.core.exceptions import ValidationError import re def check_age(value): if value < 10 or value > 120: raise ValidationError('10〜120歳の範囲で入力してください') def check_email(value): if not re.match(r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", value): raise ValidationError('メールアドレスの形式が違います') class UserForm(forms.Form): name = forms.CharField(label='名前', required=False, max_length=100) nickname = forms.CharField(label='ニックネーム', required=False, min_length=2, max_length=10, error_messages={'required': '必須です!', 'min_length': '2文字以上10文字以下です'}) age = forms.IntegerField(label='年齢', validators=[check_age]) email = forms.EmailField(label='メール', validators=[check_email]) |
14行目:
required(必須かどうか)やmax_length(文字の最大の長さ)は、入力フィールドの属性として設定するバリデーションです。
14,16行目:
CharFieldやIntegerFieldなどの入力フィールドの種類によってバリデーションの属性の種類は少し違います。
Fieldについての公式ドキュメント:https://docs.djangoproject.com/ja/2.2/ref/forms/fields/#built-in-field-classes
5,9行目:
独自のバリデーションの関数(check_ageとcheck_email)を作りました。16,17行目の属性にvalidators=[独自バリデーション名]を設定することで独自のバリデーションを呼び出しています。
views.pyとuser.htmlテンプレート
sampleapp/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from django.shortcuts import render from .forms import UserForm def new(request): params = {'message': '', 'form': None} if request.method == 'POST': form = UserForm(request.POST) params['form'] = form if form.is_valid(): params['message'] = '登録しました!' return render(request, 'user/login.html', params) else: params['message'] = 'まだ登録できません' else: params['form'] = UserForm() return render(request, 'user/user.html', params) |
9行目:
form.is_valid():でバリデーションチェックを行い正常な値だったらログイン画面に遷移し、登録できていない場合は登録画面にリダイレクトする処理を行っています。
sample/templates/user/user.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ユーザー登録画面</title> </head> <body> <h1>ユーザー登録/h1> <p>{{ message }}</p> <form method="POST" novalidate> {% csrf_token %} {{ form.as_p }} <button type="submit">送信</button> </form> </body> </html> |
13行目:{{ form.as_p }}
と書くと、フォーム内容が全て表示されます。
最後に
今回はバリデーションを実装するのにいくつか方法がある中の「from.py」「views.py」で実装する方法をご紹介しました。
clean()メソッドで、複数のフィールドに対してバリデーションを設定することができる機能があったりと便利な機能がたくさんあるので興味がある方は調べてみて下さい!!
弊社inglowでは、これから広告の運用を考えられている方、あるいはこれから広告代理店に運用をお願いされる方向けに、「業界別Web広告の成功事例」をまとめた資料を無料配布しております。
下記のフォームに入力いただくだけで、無料で資料をダウンロードしていただけます。ぜひご利用下さい。