تأكيد حضور واحد لكل بريد إلكتروني
جزء من قسم النماذج في رحلة Django على Coddy. الدرس 18 من 20.
هذا الفصل لك: ثلاث ميزات للوحة الفعاليات، مبنية على ما تعرفه. توضّح كل مهمة ما يجب أن يفعله الموقع؛ أما كتابة الشيفرة فمتروكة لك.
حاليًا، تستطيع Ada إرسال ردّ RSVP إلى أمسية الجاز يوم الجمعة كلما شاءت، وكل ردّ RSVP يحجز مقعدًا. ينبغي أن يحجز عنوان بريد إلكتروني واحد مقعدًا واحدًا لكل فعالية.
كل العناصر متوفرة لديك: طريقة clean_<field>، والفعالية التي يحتفظ بها النموذج في self.event، وردود RSVP الخاصة بها في self.event.rsvps. وهناك عملية بحث أخرى مفيدة: تقارن email__iexact النصوص دون اعتبار لحالة الأحرف، لأن Ada@Example.com وada@example.com يصلان إلى صندوق البريد نفسه.
التحدي
متوسطارفض تسجيل RSVP ثانيًا من البريد الإلكتروني نفسه للفعالية نفسها، مع ظهور This email is already on the guest list. بجوار حقل البريد الإلكتروني.
- لا يهم اختلاف الأحرف الكبيرة والصغيرة:
ADA@Example.comهوada@example.com. - لا يزال بإمكان البريد الإلكتروني نفسه تسجيل RSVP لفعالية أخرى.
سجّل RSVP لفعالية Friday Jazz Night باستخدام ADA@example.com: سترى This email is already on the guest list.
جرّب بنفسك
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