前回
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)
この状態でtitle
とcontent
を未入力のまま登録しようとすると、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
メソッドを呼び出すことで、入力値に問題があった場合、エラーメッセージが出力されます。