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 contient 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. Omettez de fields ce que la vue décide, et définissez-le dans la vue.

form.save(commit=False) construit l’objet sans l’enregistrer, afin que vous puissiez 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
  • Dans events/forms.py, ajoutez RSVPForm, un ModelForm pour RSVP qui demande uniquement name et email.
  • Dans event_detail, transmettez-le au modèle sous le nom form. Un POST valide enregistre le RSVP pour cet événement, ajoute le message You're on the list! et redirige vers la page de l'événement.

Cliquez sur Run, ouvrez un événement et inscrivez-vous.

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