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.
  • اعرض أخطاء النموذج بأكمله فوق الحقول.

اضغط على Run وجرّب تاريخ انتهاء يسبق تاريخ البدء.

جرّب بنفسك

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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس النماذج

تدرّب بنفسك: Playground لـ Django