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).
Wyzwanie
ŁatwyW 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
1Formularze HTML
Formularz wyszukiwaniaFormularz POSTPrzekierowanie po POSTPoćwicz samodzielnie: Edytor online Django