בדיקת שני שדות
חלק מהיחידה טפסים במסלול ה-Django של Coddy. שיעור 11 מתוך 20.
יריד הספרים החורפי נמשך שלושה ימים, ואסור שהתאריך הסופי יחול לפני תאריך ההתחלה. מתודת 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() מציגה הודעה מתחת לשדה אחד. העלאת forms.ValidationError בתוך clean() יוצרת שגיאה של הטופס כולו, שאף שדה לא מציג: {{ form.non_field_errors }} עושה זאת.
אתגר
בינוני- הוסף את
end_dateל-EventFormאחריdate: תאריך שיכול להיות ריק. - דחה תאריך סיום שקודם לתאריך ההתחלה באמצעות
The event cannot end before it starts., כשגיאה של הטופס כולו. - שמור את
end_dateבתוךnew_event. - הצג את השגיאות של הטופס כולו מעל השדות.
לחץ על הפעלה ונסה להזין תאריך סיום שקודם לתאריך ההתחלה.
נסו בעצמכם
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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה טפסים
2טפסי Django
טופס Djangoיצירת טופסתרגלו בעצמכם: Django אונליין