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 Dankeseite neu: Der Browser bietet an, das Formular erneut zu senden, und wenn du zustimmst, wird das Ereignis zweimal hinzugefügt. Diese Seite war die Antwort auf einen POST, daher sendet ein erneutes Laden den POST nochmals.

Die Lösung ist ein Muster namens Post/Redirect/Get. Nach dem Speichern antwortet die View mit einer Weiterleitung: Status 302 und eine neue Adresse. Der Browser öffnet diese Adresse mit einem GET, sodass bei einem erneuten Laden nur der GET wiederholt wird.

redirect() aus django.shortcuts erwartet einen URL-Namen, genauso 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 über seinen 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, statt event_added.html zu rendern. Du kannst event_added.html löschen; es wird jetzt nicht mehr verwendet.

Füge eine Veranstaltung hinzu und lade dann ihre Seite neu: Der Browser fragt nicht erneut, ob das Formular gesendet werden soll.

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