필드 두 개 검사하기
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 }}를 사용하면 표시됩니다.
챌린지
중급이벤트에 종료일을 추가합니다.
events/forms.py에서EventForm에 선택 사항인end_date날짜 필드를 추가합니다.clean()을 작성합니다. 두 날짜가 모두 있고 종료일이 시작일보다 앞서면The event cannot end before it starts.를 발생시킵니다. 날짜는.get()으로 가져옵니다.new_event에서end_date도 저장합니다.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
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
폼의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드