בדיקת שני שדות
חלק מהיחידה טפסים במסלול ה-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:
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, הוסיפו שדה תאריך אופציונלי בשםend_dateל־EventForm. כתבו את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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה טפסים
2טפסי Django
טופס Djangoיצירת טופסתרגלו בעצמכם: Django אונליין