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:
        raise forms.ValidationError("Groups over 6 need a phone number.")
    return cleaned_data

チェックに失敗したフィールドはcleaned_dataに含まれず、任意の日付が未入力の場合はNoneになるため、.get()で値を取得し、両方の値がある場合にのみ比較します。

clean()で発生させたエラーはフォーム全体に属するため、フィールドのループでは表示されません。表示するには{{ form.non_field_errors }}を使います。

challenge icon

チャレンジ

中級

イベントに終了日を追加します。

  1. events/forms.pyで、EventFormに任意のend_date日付フィールドを追加します。clean()を記述します。両方の日付が入力されていて、終了日が開始日より前の場合は、The event cannot end before it starts.を発生させます。日付は.get()で取得します。
  2. new_eventで、end_dateも保存します。
  3. 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
quiz icon腕試し

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

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

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