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, da realizzare con ciò che sai. Ogni attività specifica cosa deve fare il sito; il codice sta a te scriverlo.
Al momento Ada può inviare una RSVP per la serata Jazz del venerdì tutte le volte che vuole, e ogni RSVP occupa un posto. Un indirizzo email dovrebbe occupare un solo posto per evento.
Hai tutti gli elementi: un metodo clean_<field>, l'evento che il modulo conserva in self.event e le sue RSVP in self.event.rsvps. Un'altra ricerca è utile: email__iexact confronta il testo senza distinzione tra maiuscole e minuscole, perché Ada@Example.com e ada@example.com arrivano alla stessa casella di posta.
Sfida
MedioRifiuta una seconda conferma di partecipazione dallo stesso indirizzo email per lo stesso evento, mostrando This email is already on the guest list.</code accanto al campo email.</p><ul><li>Le maiuscole non contano: <code>ADA@Example.com equivale a ada@example.com.
Conferma la partecipazione a Friday Jazz Night con ADA@example.com: vedrai This email is already on the guest list.
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