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.
Défi
MoyenPermettez aux visiteurs de confirmer leur présence.
- Dans
events/forms.py, écrivez une ModelFormRSVPFormpourRSVPavec uniquementnameetemail. - Dans
event_detail, transmettez uneRSVPFormà la page sous le nomform. Pour une requête POST, créez-la à partir derequest.POST. - Si elle est valide, enregistrez-la avec
commit=False, définissez son événement, enregistrez-la, ajoutezYou'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
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