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:
self.add_error("phone", "Groups over 6 need a phone number.")
return cleaned_dataチェックに失敗したフィールドはcleaned_dataに含まれず、任意の日付が未入力の場合はNoneになるため、.get()で取得し、両方の値がある場合にのみ比較します。
self.add_error()は、指定したフィールドの下にメッセージを表示します。clean()でforms.ValidationErrorを送出するとフォーム全体のエラーになります。これはどのフィールドにも表示されず、{{ form.non_field_errors }}で表示します。
チャレンジ
中級dateの後にEventFormへend_dateを追加します。空欄にできる日付です。- 開始日より前の終了日を拒否し、フォーム全体のエラーとして
The event cannot end before it starts.を表示します。 new_eventでend_dateを保存します。- フォーム全体のエラーを入力欄の上に表示します。
Runを押して、開始日より前の終了日を試してください。
自分で試してみよう
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プレイグラウンド