التحقق من حقلين
جزء من قسم النماذج في رحلة 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 }} فتعرضه.
التحدي
متوسطأُضيف تاريخ انتهاء إلى الفعاليات.
- في
events/forms.py، أضف حقل تاريخend_dateاختياريًا إلىEventForm. اكتبclean(): عندما يكون التاريخان موجودين ويأتي تاريخ الانتهاء أولًا، ارفعThe event cannot end before it starts.. اقرأ التاريخين باستخدام.get(). - في
new_event، احفظend_dateأيضًا. - في
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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس النماذج
2نماذج Django
نموذج في Djangoعرض نموذجتدرّب بنفسك: Playground لـ Django