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.
Tantangan
SedangTolak 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.comsama denganada@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