Menu
CoddyTech

Przekierowanie po POST

Część sekcji Formularze ścieżki Django w Coddy. Lekcja 3 z 20.

Dodaj wydarzenie, a następnie odśwież stronę z podziękowaniem: przeglądarka proponuje ponowne wysłanie formularza, a zaakceptowanie tej propozycji dodaje wydarzenie dwukrotnie. Strona odpowiada na żądanie POST, więc jej odświeżenie ponawia żądanie POST.

Rozwiązaniem jest wzorzec o nazwie Post/Redirect/Get. Po zapisaniu widok odpowiada przekierowaniem: statusem 302 i nowym adresem. Przeglądarka otwiera ten adres za pomocą żądania GET, więc odświeżenie ponawia tylko żądanie GET.

redirect() z django.shortcuts przyjmuje nazwę URL-a, podobnie jak {% url %}. Sklep, który dodaje produkt do koszyka:

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

URL z argumentem przyjmuje go po nazwie: redirect("shop:product", pk=7).

challenge icon

Wyzwanie

Łatwy

W funkcji new_event, po utworzeniu wydarzenia, przekieruj na stronę tego wydarzenia zamiast renderować event_added.html. Szablon z podziękowaniem nie jest już używany: usuń go.

Naciśnij Run, dodaj wydarzenie i ponownie załaduj stronę, na której się znajdziesz.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Formularze

Poćwicz samodzielnie: Edytor online Django