Menu
CoddyTech

Satu RSVP per Email

Termasuk bagian Formulir dalam perjalanan Django di Coddy. Pelajaran 18 dari 20.

Bab ini milikmu: tiga fitur untuk papan acara, dibuat dengan pengetahuan yang sudah kamu miliki. Setiap tugas menjelaskan apa yang harus dilakukan situs. Kodenya terserah kamu.

Saat ini Ada bisa RSVP untuk Friday Jazz Night sesering yang ia mau, dan setiap RSVP mengambil satu tempat. Satu email seharusnya menempati satu tempat untuk setiap acara.

Kamu sudah punya semua yang diperlukan: method clean_<field>, acara yang disimpan formulir dalam self.event, dan RSVP-nya dalam self.event.rsvps. Satu pencarian lagi akan membantu: email__iexact membandingkan teks tanpa membedakan huruf besar dan kecil, karena Ada@Example.com dan ada@example.com masuk ke kotak masuk yang sama.

challenge icon

Tantangan

Sedang

Tolak RSVP kedua dari email yang sama untuk acara yang sama, dengan This email is already on the guest list. di bawah kolom email.

  • Huruf kapital tidak berpengaruh: ADA@Example.com sama dengan ada@example.com.
  • Email yang sama tetap bisa digunakan untuk RSVP ke acara lain.

Tekan Jalankan, lalu RSVP dua kali ke Friday Jazz Night dengan satu email.

Coba sendiri

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

Semua pelajaran di Formulir

Latihan sendiri: Playground Django