필드 두 개 검사하기
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 }}가 표시합니다.
챌린지
중급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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
폼의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드