Menu
CoddyTech

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 }}で表示します。

challenge icon

チャレンジ

中級
  • 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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

フォームのすべてのレッスン

自分で練習してみよう: Djangoプレイグラウンド