Django フォームのバリデーションを実装する

シェアする

前回はフォームの実装を行いました。今回は、そのフォームに対してバリデーションを実装していきたいと思います。Django のバリデーションには大きく2つのバリデーションがあり、1つは Django のバリデーションと、もう1つは独自のバリデーションです。

完成イメージ

エラー

成功

バージョン

  • 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つの方法がありました。

コメント

  1. 匿名 より:

    cleanメソッドの実装なのですが、他のサイトだと最後にcleaned_dataを返しているのですが、このサイトではそれがありません。
    どちらが正しいのでしょうか?