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

challenge icon

Sfida

Medio

Rifiuta 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.com equivale a ada@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