Menu
CoddyTech

필드 두 개 검사하기

Coddy Django 여정의 폼 섹션에 포함된 레슨. 20개 중 11번째.

겨울 도서 박람회는 3일 동안 진행되며, 종료일은 시작일보다 앞설 수 없습니다. clean_<field> 메서드는 하나의 필드만 확인하므로, 여러 필드에 걸친 규칙은 모든 필드의 자체 검사가 끝난 뒤 실행되는 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 플레이그라운드