تأكيد حضور واحد لكل بريد إلكتروني
جزء من قسم النماذج في رحلة Django على Coddy. الدرس 18 من 20.
هذا الفصل لك: ثلاث ميزات للوحة الفعاليات، تنفّذها بما تعلمته. توضح كل مهمة ما يجب على الموقع فعله؛ أما كتابة الشيفرة فتعود إليك.
حاليًا، تستطيع Ada تسجيل الحضور في فعالية Friday Jazz Night كلما أرادت، وكل تسجيل حضور يشغل مقعدًا. ينبغي أن يشغل عنوان بريد إلكتروني واحد مقعدًا واحدًا لكل فعالية.
لديك كل ما تحتاج إليه: طريقة clean_<field>، والفعالية التي يحتفظ بها النموذج في self.event، وتسجيلات الحضور الخاصة بها في self.event.rsvps. وهناك عملية بحث إضافية مفيدة: تقارن email__iexact النصوص دون اعتبار لحالة الأحرف، لأن Ada@Example.com وada@example.com يصلان إلى صندوق البريد نفسه.
التحدي
متوسطارفض طلب تأكيد الحضور الثاني بالبريد الإلكتروني نفسه للفعالية نفسها، مع إظهار This email is already on the guest list. أسفل حقل البريد الإلكتروني.
- لا يهم استخدام الأحرف الكبيرة:
ADA@Example.comهوada@example.com. - يظل بإمكان البريد الإلكتروني نفسه تأكيد الحضور لفعالية أخرى.
اضغط على «تشغيل»، وأكّد الحضور مرتين لفعالية Friday Jazz Night باستخدام بريد إلكتروني واحد.
جرّب بنفسك
import datetime
from django import forms
from .models import RSVP, Event
class EventForm(forms.ModelForm):
class Meta:
model = Event
fields = ["title", "date", "end_date", "place", "description", "capacity"]
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
def clean(self):
cleaned_data = super().clean()
date = cleaned_data.get("date")
end_date = cleaned_data.get("end_date")
if date and end_date and end_date < date:
raise forms.ValidationError("The event cannot end before it starts.")
return cleaned_data
class RSVPForm(forms.ModelForm):
class Meta:
model = RSVP
fields = ["name", "email"]
def __init__(self, *args, event=None, **kwargs):
super().__init__(*args, **kwargs)
self.event = event
def clean(self):
cleaned_data = super().clean()
if self.event.rsvps.count() >= self.event.capacity:
raise forms.ValidationError("Sorry, this event is full.")
return cleaned_data
جميع دروس النماذج
تدرّب بنفسك: Playground لـ Django