Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Rifiuta 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.

  • Lo stesso indirizzo email può comunque confermare la partecipazione a un altro evento.
  • 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