Menu
CoddyTech

Redirection après POST

Fait partie de la section Formulaires du Journey Django de Coddy. Leçon 3 sur 20.

Ajoute un événement, puis recharge la page de remerciement : le navigateur propose d’envoyer à nouveau le formulaire, et si tu acceptes, l’événement est ajouté deux fois. Cette page était la réponse à un POST ; la recharger envoie donc à nouveau le POST.

La solution est un modèle appelé Post/Redirect/Get. Après l’enregistrement, la vue répond par une redirection : statut 302 et nouvelle adresse. Le navigateur ouvre cette adresse avec un GET ; recharger la page ne répète donc que le GET.

redirect() de django.shortcuts prend un nom d’URL, comme le fait {% 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 avec un argument, indique sa valeur par son nom : redirect("shop:product", pk=7).

challenge icon

Défi

Facile

Dans new_event, après avoir créé l’événement, redirigez vers la page de cet événement au lieu d’afficher event_added.html. Vous pouvez supprimer event_added.html : il n’est plus utilisé.

Ajoutez un événement, puis rechargez sa page : le navigateur ne vous demande pas de renvoyer le formulaire.

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

Entraînez-vous par vous-même : Playground Django