Menu
CoddyTech

Pengalihan Setelah POST

Termasuk bagian Formulir dalam perjalanan Django di Coddy. Pelajaran 3 dari 20.

Tambahkan sebuah acara, lalu muat ulang halaman terima kasih: browser menawarkan untuk mengirim formulir lagi, dan jika kamu menyetujuinya, acara tersebut ditambahkan dua kali. Halaman itu adalah respons terhadap POST, jadi saat dimuat ulang, browser mengirim POST lagi.

Solusinya adalah pola yang disebut Post/Redirect/Get. Setelah menyimpan, view memberikan respons berupa redirect: status 302 dan alamat baru. Browser membuka alamat tersebut dengan GET, jadi saat dimuat ulang, browser hanya mengulangi GET.

redirect() dari django.shortcuts menerima nama URL, seperti {% url %}. Contoh 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 dengan argumen menerima argumennya berdasarkan nama: redirect("shop:product", pk=7).

challenge icon

Tantangan

Mudah

Di new_event, setelah membuat event, arahkan ke halaman event baru itu sendiri, bukan merender event_added.html. Kamu bisa menghapus event_added.html; sekarang tidak ada yang menggunakannya.

Tambahkan event, lalu muat ulang halamannya: browser tidak akan meminta kamu mengirim formulir lagi.

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