2つのフィールドをチェックする
CoddyのDjangoジャーニー「フォーム」セクションの一部。レッスン 11/20。
冬のブックフェアは3日間続き、終了日は開始日より前になってはいけません。clean_<field>メソッドは1つのフィールドを扱うため、複数のフィールドにまたがるルールはclean()に記述します。このメソッドは、各フィールド固有のチェックがすべて終わった後に実行されます。6人を超えるグループは電話番号を記入しなければならない予約フォームの例です。
def clean(self):
cleaned_data = super().clean()
guests = cleaned_data.get("guests")
phone = cleaned_data.get("phone")
if guests and guests > 6 and not phone:
raise forms.ValidationError("Groups over 6 need a phone number.")
return cleaned_dataチェックに失敗したフィールドはcleaned_dataに含まれず、任意の日付が未入力の場合はNoneになるため、.get()で値を取得し、両方の値がある場合にのみ比較します。
clean()で発生させたエラーはフォーム全体に属するため、フィールドのループでは表示されません。表示するには{{ form.non_field_errors }}を使います。
チャレンジ
中級イベントに終了日を追加します。
events/forms.pyで、EventFormに任意のend_date日付フィールドを追加します。clean()を記述します。両方の日付が入力されていて、終了日が開始日より前の場合は、The event cannot end before it starts.を発生させます。日付は.get()で取得します。new_eventで、end_dateも保存します。new_event.htmlで、ループの上にform.non_field_errorsを表示します。
終了日を開始日より前に設定すると、そのメッセージが表示されます。
自分で試してみよう
import datetime
from django import forms
class EventForm(forms.Form):
title = forms.CharField(max_length=100)
date = forms.DateField()
place = forms.CharField(max_length=100)
description = forms.CharField(widget=forms.Textarea, required=False)
capacity = forms.IntegerField(min_value=1)
def clean_date(self):
date = self.cleaned_data["date"]
if date < datetime.date.today():
raise forms.ValidationError("The date cannot be in the past.")
return date
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
フォームのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド