0
0

More than 1 year has passed since last update.

バリデーションの設定

Last updated at Posted at 2021-12-19

前回

1. Djangoを使ったCRUD機能実装&Herokuデプロイ
2. 1対多のアソシエーション実装&確認ダイアログ

バリデーションの仕組み

バリデーションはforms.Formを使用した場合とforms.ModelFormを使用した場合とで設定方法が異なります。

forms.Formの場合

forms.Formでは、フォームを定義しているforms.pyの中でバリデーションを設定します。
以前のforms.pyでは以下のように記述をしていました。

[blog_app/forms.py]

from django import forms


class BlogForm(forms.Form):
    title = forms.CharField(label='TITLE', max_length=100)
    content = forms.CharField(label='CONTENT', max_length=300)

ここのmax_lengthの部分がバリデーションの設定です。
この設定により、titleのフォームには100文字、contentのフォームには300文字しか入力ができないよう入力制限がかかります。
バリデーションを追加してみましょう。

[blog_app/forms.py]

from django import forms


class BlogForm(forms.Form):
    title = forms.CharField(label='TITLE', max_length=100, required=False)
    content = forms.CharField(label='CONTENT', max_length=300)

この状態でtitlecontentを未入力のまま登録しようとすると、contentのみバリデーションがかかります。
forms.Formはデフォルトで入力必須のバリデーション(required=True)が設定されています。
未入力でも登録を許可する場合はrequired=Falseを設定します。

forms.ModelFormの場合

forms.ModelFormの場合はmodels.pyの中でバリデーションを設定します。
現在のforms.pyでは以下のように記述をしています。

[blog_app/forms.py]

from django import forms
from .models import Blog


class BlogForm(forms.ModelForm):
    class Meta:
        model = Blog
        fields = ['title', 'content']

ここのmax_lengthの部分がバリデーションの設定です。

空文字のバリデーションを表示させる

半角スペースを入力して登録しようとした場合、現時点ではバリデーションが何も表示されません。
そこで、バリデーションエラーが表示するようcreate関数を以下のように修正します。

def create(request):
    params = {
        'form': BlogForm(),
    }
    if (request.method == 'POST'):
        obj = Blog()
        form = BlogForm(request.POST, instance=obj)
        params['form'] = form
        if (form.is_valid()):   # ポイント1
            form.save()
            return redirect(to='/blog_app')
    return render(request, 'blog/create.html', params)

ポイント1:入力値を使って生成したBlogFormオブジェクトに対してis_validメソッドを呼び出すことで、入力値に問題があった場合、エラーメッセージが出力されます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0