Menu
CoddyTech

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

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

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

حاليًا، تستطيع Ada تسجيل الحضور في فعالية Friday Jazz Night كلما أرادت، وكل تسجيل حضور يشغل مقعدًا. ينبغي أن يشغل عنوان بريد إلكتروني واحد مقعدًا واحدًا لكل فعالية.

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

challenge icon

التحدي

متوسط

ارفض طلب تأكيد الحضور الثاني بالبريد الإلكتروني نفسه للفعالية نفسها، مع إظهار 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