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

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

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

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