前回はフォームの実装を行いました。今回は、そのフォームに対してバリデーションを実装していきたいと思います。Django のバリデーションには大きく2つのバリデーションがあり、1つは Django のバリデーションと、もう1つは独自のバリデーションです。
Contents
完成イメージ
エラー
成功
バージョン
- Python 3.6.4
- Django 2.0.3
インストール
Python, Django のインストール
Python と Django のインストールについては、こちらの記事を参考にしてください。
実装
forms.py
from django import forms class ContactForm(forms.Form): name = forms.CharField(label='名前', max_length=20, widget=forms.TextInput(attrs={'class': 'form-control'})) email = forms.EmailField(label='email', widget=forms.EmailInput(attrs={'class': 'form-control'})) message = forms.CharField(label='内容', max_length=256, widget=forms.Textarea(attrs={'class': 'form-control'})) def send_email(self): # send email using the self.cleaned_data dictionary pass def clean_name(self): name = self.cleaned_data['name'] # if name のバリデーションルール: # raise forms.ValidationError('name のバリデーションに引っかかりました。') return name def clean_email(self): email = self.cleaned_data['email'] return email def clean_message(self): message = self.cleaned_data['message'] return message def clean(self): cleaned_data = super().clean() # if name と email の組み合わせバリデーションルール: # raise forms.ValidationError('name と email の組み合わせバリデーションに引っかかりました。') return cleaned_data
バリデーションは、forms.py に実装します。
Django のバリデーション実装方法は、大きく2つあります。1つは Django のバリデーションと、もう1つは独自のバリデーションです。
Django のバリデーション
Django のバリデーションとは、Django の機能を使ってバリデーション処理やエラーメッセージを出力するものです。具体的には、以下のものを指します。
- 必須 required
- 文字数 min_length, max_length
これらは、フィールドの種類によって、異なりますので、詳細はオフィシャルを確認しましょう。Form fields | Django document | Django
独自のバリデーション
Django のバリデーションで足りない場合は、独自のバリデーションを実装します。
独自のバリデーション実装方法は、大きく2つあります。1つはフィールド毎のバリデーションと、もう1つは複数フィールドを組み合わせたバリデーションです。
フィールド毎のバリデーション
フィールド毎のバリデーションは、clean_フィールド名関数に実装します。
エラーにしたいときは、raise forms.ValidationError(‘エラーメッセージ’) をします。
複数フィールドを組み合わせたバリデーション
複数フィールドを組み合わせたバリデーションは、clean関数に実装します。
エラーにしたいときは、フィールド毎のバリデーションと同様に、raise forms.ValidationError(‘エラーメッセージ’) をします。
views.py
from django.contrib import messages from django.views.generic import FormView from .forms import ContactForm class ContactView(FormView): form_class = ContactForm template_name = 'app/contact.html' success_url = '.' def form_valid(self, form): form.send_email() messages.success(self.request, 'お問い合わせを受け付けました。') return super().form_valid(form) def form_invalid(self, form): messages.error(self.request, '入力内容をご確認ください。') return super().form_invalid(form)
form_valid
入力された値に問題なく、バリデーションを通れば、form_valid 関数が呼ばれます。ここに正常系の処理を実装します。
form_invalid
バリデーションに引っかかった場合は、form_invalid 関数が呼ばれます。ここに異常系の処理を実装します。
tree
$ tree . ├── app │ ├── __init__.py │ ├── apps.py │ ├── forms.py │ ├── templates │ │ └── app │ │ └── contact.html │ └── views.py ├── form_validation │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py 4 directories, 10 files
ファイル構成は前回と変わっていません。前回と変わっているのは、views.py と forms.py の内容だけです。
実行
$ python3.6 manage.py runserver 0.0.0.0:8000
実行はいつものように runserver を使います。
http:// [IPアドレス] :8000 でアクセスしてフォームの確認ができると思います。
まとめ
Django のフォームのバリデーションを実装しました。
Django のバリデーションを実装する方法は、Django の機能を使う方法と独自の方法の2つがあり、さらに、独自の方法も2つの方法がありました。