Menu
CoddyTech

Un formulaire de confirmation de présence

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

Les visiteurs veulent indiquer qu’ils viennent. Le projet a un nouveau modèle RSVP avec une ForeignKey vers Event (related_name="rsvps"), et chaque page d’événement comporte un formulaire sous le titre Vous venez ?

Le formulaire RSVP demande un nom et une adresse e-mail, jamais l’événement : le visiteur se trouve sur la page de cet événement, et un champ lui permettrait d’en choisir un autre. N’inclus pas l’événement dans fields et définis-le plutôt dans la vue.

form.save(commit=False) crée l’objet sans l’enregistrer, afin que tu puisses d’abord définir le reste. Le formulaire de commande d’une boutique ne demande jamais le statut :

form = OrderForm(request.POST)
if form.is_valid():
    order = form.save(commit=False)
    order.status = "new"
    order.save()

Un simple form.save() enregistre immédiatement la ligne, et une ForeignKey obligatoire laissée vide provoque une erreur IntegrityError.

challenge icon

Défi

Moyen

Permettez aux visiteurs de confirmer leur présence.

  1. Dans events/forms.py, écrivez une ModelForm RSVPForm pour RSVP avec uniquement name et email.
  2. Dans event_detail, transmettez une RSVPForm à la page sous le nom form. Pour une requête POST, créez-la à partir de request.POST.
  3. Si elle est valide, enregistrez-la avec commit=False, définissez son événement, enregistrez-la, ajoutez You're on the list! et redirigez vers l’événement. Sinon, affichez à nouveau le formulaire.

Confirmez votre présence à Friday Jazz Night : vous voyez You're on the list!

Essayez vous-même

from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect, render

from .forms import EventForm
from .models import Event


def event_list(request):
    q = request.GET.get("q", "")
    events = Event.objects.all()
    if q:
        events = events.filter(title__icontains=q)
    return render(request, "events/event_list.html", {"events": events, "q": q})


def event_detail(request, pk):
    event = get_object_or_404(Event, pk=pk)
    return render(request, "events/event_detail.html", {"event": event})


def new_event(request):
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save()
            messages.success(request, "Your event was added.")
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm()
    return render(request, "events/new_event.html", {"form": form})


def edit_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    if request.method == "POST":
        form = EventForm(request.POST, instance=event)
        if form.is_valid():
            form.save()
            messages.success(request, "Your changes were saved.")
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm(instance=event)
    return render(request, "events/edit_event.html", {"form": form, "event": event})


def delete_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    if request.method == "POST":
        event.delete()
        messages.success(request, "The event was deleted.")
        return redirect("events:list")
    return render(request, "events/delete_event.html", {"event": event})

Toutes les leçons de Formulaires

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