Pengalihan Setelah POST
Termasuk bagian Formulir dalam perjalanan Django di Coddy. Pelajaran 3 dari 20.
Tambahkan sebuah acara, lalu muat ulang halaman ucapan terima kasih: browser menawarkan untuk mengirim formulir lagi, dan jika kamu menyetujuinya, acara akan ditambahkan dua kali. Halaman ini merespons POST, jadi pemuatan ulang akan mengulangi POST.
Solusinya adalah pola yang disebut Post/Redirect/Get. Setelah menyimpan, view merespons dengan pengalihan: status 302 dan alamat baru. Browser membuka alamat itu dengan GET, jadi pemuatan ulang hanya mengulangi GET.
redirect() dari django.shortcuts menerima nama URL, seperti {% url %}. Toko yang menambahkan item ke keranjang:
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 yang memiliki argumen menerima argumen itu berdasarkan namanya: redirect("shop:product", pk=7).
Tantangan
MudahDi new_event, setelah membuat acara, arahkan ke halaman acara baru itu sendiri, bukan merender event_added.html. Template ucapan terima kasih kemudian tidak digunakan: hapus template itu.
Tekan Jalankan, tambahkan acara, lalu muat ulang halaman yang terbuka.
Coba sendiri
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")
Semua pelajaran di Formulir
Latihan sendiri: Playground Django