Un RSVP per email
Fa parte della sezione Form del percorso Django di Coddy. Lezione 18 di 20.
Questo capitolo è tuo: tre funzionalità per la bacheca degli eventi, realizzate con ciò che sai. Ogni attività indica cosa deve fare il sito; il codice sta a te scriverlo.
Al momento Ada può confermare la partecipazione alla Serata Jazz di venerdì tutte le volte che vuole, e ogni conferma occupa un posto. Un indirizzo email dovrebbe occupare un solo posto per evento.
Hai tutto ciò che ti serve: un metodo clean_<field>, l'evento conservato dal modulo in self.event e le relative conferme in self.event.rsvps. Un'altra ricerca è utile: email__iexact confronta il testo senza distinguere tra maiuscole e minuscole, perché Ada@Example.com e ada@example.com arrivano alla stessa casella di posta.
Sfida
MedioRifiuta una seconda RSVP dallo stesso indirizzo email per lo stesso evento, mostrando This email is already on the guest list. sotto il campo dell’email.
- Le maiuscole non contano:
ADA@Example.comequivale aada@example.com. - Lo stesso indirizzo email può comunque fare RSVP per un altro evento.
Premi Run e fai RSVP due volte per Friday Jazz Night usando un solo indirizzo email.
Provalo tu
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
Tutte le lezioni di Form
Esercitati da solo: Playground Django