التحقق من حقلين
جزء من قسم النماذج في رحلة 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 }}.
التحدي
متوسط- أضف
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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس النماذج
2نماذج Django
نموذج في Djangoعرض نموذجتدرّب بنفسك: Playground لـ Django