Menu
CoddyTech

Reindirizzamento dopo POST

Fa parte della sezione Form del percorso Django di Coddy. Lezione 3 di 20.

Aggiungi un evento, poi ricarica la pagina di ringraziamento: il browser propone di inviare di nuovo il modulo e, se accetti, l'evento viene aggiunto due volte. La pagina risponde a una richiesta POST, quindi ricaricandola la richiesta POST viene ripetuta.

La soluzione è uno schema chiamato Post/Redirect/Get. Dopo il salvataggio, la vista risponde con un reindirizzamento: stato 302 e un nuovo indirizzo. Il browser apre quell'indirizzo con una richiesta GET, quindi ricaricando la pagina viene ripetuta solo la richiesta GET.

redirect() da django.shortcuts accetta un nome URL, proprio come fa {% url %}. Un negozio che aggiunge un articolo al carrello:

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")
    ...

Un URL con un argomento lo accetta per nome: redirect("shop:product", pk=7).

challenge icon

Sfida

Facile

In new_event, dopo aver creato l'evento, reindirizza alla pagina dell'evento appena creato invece di eseguire il rendering di event_added.html. Il template di ringraziamento non viene più usato: eliminalo.

Premi Esegui, aggiungi un evento e ricarica la pagina su cui arrivi.

Provalo tu

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")

Tutte le lezioni di Form

Esercitati da solo: Playground Django