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:
        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 }} עושה זאת.

challenge icon

אתגר

בינוני
  • הוסף את 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
quiz iconבחנו את עצמכם

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

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

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