Menu
CoddyTech

Weiterleitung nach POST

Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 3 von 20.

Füge ein Ereignis hinzu und lade dann die Dankesseite neu: Der Browser bietet an, das Formular erneut zu senden, und wenn du zustimmst, wird das Ereignis zweimal hinzugefügt. Die Seite antwortet auf eine POST-Anfrage, also wird beim Neuladen die POST-Anfrage wiederholt.

Die Lösung ist ein Muster namens Post/Redirect/Get. Nach dem Speichern antwortet die Ansicht mit einer Weiterleitung: Status 302 und einer neuen Adresse. Der Browser öffnet diese Adresse mit einer GET-Anfrage, sodass beim Neuladen nur die GET-Anfrage wiederholt wird.

redirect() aus django.shortcuts erwartet einen URL-Namen, genau wie {% url %}. Ein Shop, der einen Artikel zum Warenkorb hinzufügt:

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

Bei einer URL mit einem Argument gibst du dieses mit seinem Namen an: redirect("shop:product", pk=7).

challenge icon

Aufgabe

Einfach

Leite in new_event nach dem Erstellen der Veranstaltung auf die eigene Seite der neuen Veranstaltung weiter, anstatt event_added.html zu rendern. Die Dankesvorlage wird dann nicht mehr verwendet: Lösche sie.

Klicke auf „Run“, füge eine Veranstaltung hinzu und lade die Seite neu, auf der du landest.

Probier es selbst

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

Alle Lektionen in Formulare

Übe selbstständig: Django-Playground