Menu
CoddyTech

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

challenge icon

Tantangan

Mudah

Di 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