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.
Défi
Moyen- Dans
events/forms.py, ajoutezRSVPForm, un ModelForm pourRSVPqui demande uniquementnameetemail. - Dans
event_detail, transmettez-le au modèle sous le nomform. Un POST valide enregistre le RSVP pour cet événement, ajoute le messageYou'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
3Formulaires de modèle
Un formulaire de modèleModifier un événementSupprimer un événementMessages de réussiteEntraînez-vous par vous-même : Playground Django