Redirection après POST
Fait partie de la section Formulaires du Journey Django de Coddy. Leçon 3 sur 20.
Ajoutez un événement, puis rechargez la page de remerciement : le navigateur propose de renvoyer le formulaire, et si vous acceptez, l’événement est ajouté deux fois. La page répond à une requête POST ; recharger la page répète donc la requête POST.
La solution est un modèle appelé Post/Redirect/Get. Après l’enregistrement, la vue répond par une redirection : un statut 302 et une nouvelle adresse. Le navigateur ouvre cette adresse avec une requête GET ; recharger la page répète donc uniquement la requête GET.
redirect() de django.shortcuts prend un nom d’URL, comme {% url %}. Voici une boutique qui ajoute un article au panier :
from django.shortcuts import redirect
def add_to_cart(request, pk):
if request.method == "POST":
CartItem.objects.create(product_id=pk)
return redirect("shop:cart")
...Pour une URL qui prend un argument, passez-le par son nom : redirect("shop:product", pk=7).
Défi
FacileDans new_event, après avoir créé l’événement, redirige vers la page de l’événement lui-même au lieu d’afficher event_added.html. Le modèle de remerciement n’est alors plus utilisé : supprime-le.
Clique sur Exécuter, ajoute un événement, puis recharge la page sur laquelle tu arrives.
Essayez vous-même
from django.shortcuts import get_object_or_404, render
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":
Event.objects.create(
title=request.POST["title"],
date=request.POST["date"],
place=request.POST["place"],
)
return render(request, "events/event_added.html")
return render(request, "events/new_event.html")
Toutes les leçons de Formulaires
1Formulaires HTML
Un formulaire de rechercheUn formulaire POSTRedirection après POST3Formulaires 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