Menu
CoddyTech

בדיקת שני שדות

חלק מהיחידה טפסים במסלול ה-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 }} כן מציג אותה.

challenge icon

אתגר

בינוני

לאירועים מתווסף תאריך סיום.

  1. ב־events/forms.py, הוסיפו שדה תאריך אופציונלי בשם end_date ל־EventForm. כתבו את clean(): כאשר שני התאריכים קיימים ותאריך הסיום קודם לתאריך ההתחלה, העלו את The event cannot end before it starts. קראו את התאריכים באמצעות .get().
  2. ב־new_event, שמרו גם את end_date.
  3. ב־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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה טפסים

תרגלו בעצמכם: Django אונליין