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:
        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 뒤에 end_date를 EventForm에 추가하세요. 비워 둘 수 있는 날짜입니다.
  • 시작 날짜보다 빠른 종료 날짜는 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 플레이그라운드