Menu
CoddyTech

Un événement complet

Fait partie de la section Formulaires du Journey Django de Coddy. Leçon 17 sur 20.

Le cours de poterie compte 2 places et 2 invités, pourtant son formulaire en accepte encore davantage. La règle doit être appliquée dans le formulaire, mais seule la vue sait pour quel événement le formulaire est créé.

Un formulaire est une classe, il peut donc accepter davantage d’arguments. Passe le tien comme argument nommé dans __init__, conserve-le dans self et transmets le reste à __init__ de Django. Un formulaire d’enchère qui a besoin de l’article mis aux enchères :

class BidForm(forms.Form):
    amount = forms.IntegerField()

    def __init__(self, *args, item=None, **kwargs):
        super().__init__(*args, **kwargs)
        self.item = item

    def clean_amount(self):
        amount = self.cleaned_data["amount"]
        if amount <= self.item.top_bid:
            raise forms.ValidationError("Bid more than the top bid.")
        return amount

La vue transmet l’article chaque fois qu’elle crée le formulaire : BidForm(request.POST, item=item). Nommer item dans la signature l’exclut de **kwargs ; le formulaire de Django ne le connaît pas et déclencherait une TypeError.

challenge icon

Défi

Moyen

Refuse les réponses à un événement complet avec Sorry, this event is full. :

  • Transmets l’événement à RSVPForm comme argument nommé event, et utilise-le dans une vérification de l’ensemble du formulaire.
  • Un événement auquel il reste une place peut encore accueillir un invité.
  • Transmets l’événement partout où event_detail crée le formulaire.

Appuie sur Run et confirme ta participation au cours de poterie.

Essayez vous-même

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"]
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Formulaires

Entraînez-vous par vous-même : Playground Django