Supprimer un événement
Fait partie de la section Formulaires du Journey Django de Coddy. Leçon 14 sur 20.
Un lien est une requête GET, et une requête GET ne doit jamais modifier les données. Les navigateurs chargent les liens à l’avance, les applications de messagerie les ouvrent pour afficher un aperçu et les moteurs de recherche suivent tous les liens qu’ils trouvent. Un lien qui supprimerait un événement le ferait sans que personne ait pris cette décision.
Une modification se fait donc en deux étapes : une requête GET affiche une page qui demande confirmation, puis une requête POST, envoyée par un bouton dans un formulaire, effectue l’action. Une application de facturation qui marque une facture comme payée :
def pay_invoice(request, pk):
invoice = get_object_or_404(Invoice, pk=pk)
if request.method == "POST":
invoice.paid = True
invoice.save()
return redirect("bills:invoice", pk=invoice.pk)
return render(request, "bills/confirm_pay.html", {"invoice": invoice})Le formulaire de confirmation n’a besoin d’aucun champ, seulement du jeton et d’un bouton ; un formulaire sans action envoie une requête POST à la page sur laquelle il se trouve. La méthode .delete() d’une ligne la supprime. Après la suppression, redirige vers une page qui existe toujours.
Défi
FacileLe lien Supprimer cet événement et sa page sont prêts :
- Dans
delete_event, une requête GET affiche uniquement la page. Une requête POST supprime l’événement et redirige vers la liste des événements. - Dans
delete_event.html, ajoute un formulaire qui envoie une requête à cette page, avec un boutonDelete.
Clique sur Exécuter, ouvre un événement et supprime-le.
Essayez vous-même
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()
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()
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)
# Supprimer l’événement uniquement lorsque le formulaire est envoyé, puis revenir à la liste.
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