Menu
CoddyTech

تأكيد حضور واحد لكل بريد إلكتروني

جزء من قسم النماذج في رحلة Django على Coddy. الدرس 18 من 20.

هذا الفصل لك: ثلاث ميزات للوحة الفعاليات، مبنية على ما تعرفه. توضّح كل مهمة ما يجب أن يفعله الموقع؛ أما كتابة الشيفرة فمتروكة لك.

حاليًا، تستطيع Ada إرسال ردّ RSVP إلى أمسية الجاز يوم الجمعة كلما شاءت، وكل ردّ RSVP يحجز مقعدًا. ينبغي أن يحجز عنوان بريد إلكتروني واحد مقعدًا واحدًا لكل فعالية.

كل العناصر متوفرة لديك: طريقة clean_<field>، والفعالية التي يحتفظ بها النموذج في self.event، وردود RSVP الخاصة بها في self.event.rsvps. وهناك عملية بحث أخرى مفيدة: تقارن email__iexact النصوص دون اعتبار لحالة الأحرف، لأن Ada@Example.com وada@example.com يصلان إلى صندوق البريد نفسه.

challenge icon

التحدي

متوسط

ارفض تسجيل 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