Menghapus Acara
Termasuk bagian Formulir dalam perjalanan Django di Coddy. Pelajaran 14 dari 20.
Tautan adalah GET, dan GET tidak boleh pernah mengubah data. Browser memuat tautan terlebih dahulu, aplikasi obrolan membukanya untuk menampilkan pratinjau, dan mesin pencari mengikuti setiap tautan yang ditemukan. Tautan yang menghapus sebuah acara akan menghapusnya tanpa ada yang memutuskan untuk melakukannya.
Jadi, perubahan dilakukan dalam dua langkah: GET menampilkan halaman yang meminta konfirmasi, lalu POST, yang dikirim melalui tombol di dalam form, melakukan tindakan. Aplikasi penagihan yang menandai faktur sebagai lunas:
def pay_invoice(request, pk):
invoice = get_object_or_404(Invoice, pk=pk)
if request.method == "POST":
invoice.paid = True
invoice.save()
return redirect("bills:invoice", pk=invoice.pk)
return render(request, "bills/confirm_pay.html", {"invoice": invoice})Form konfirmasi tidak memerlukan field, hanya token dan tombol. Form tanpa action mengirim POST ke halaman tempat form itu berada. .delete() pada sebuah baris akan menghapusnya. Setelah menghapus, arahkan ke halaman yang masih ada.
Tantangan
MudahTautan Hapus acara ini dan halamannya sudah siap:
- Di
delete_event, permintaan GET hanya menampilkan halaman. Permintaan POST menghapus acara dan mengarahkan kembali ke daftar acara. - Di
delete_event.html, tambahkan formulir yang mengirimkan POST ke halaman ini, dengan tombolDelete.
Tekan Jalankan, buka sebuah acara, lalu hapus.
Coba sendiri
from django.shortcuts import get_object_or_404, redirect, render
from .forms import EventForm
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":
form = EventForm(request.POST)
if form.is_valid():
event = form.save()
return redirect("events:detail", pk=event.pk)
else:
form = EventForm()
return render(request, "events/new_event.html", {"form": form})
def edit_event(request, pk):
event = get_object_or_404(Event, pk=pk)
if request.method == "POST":
form = EventForm(request.POST, instance=event)
if form.is_valid():
form.save()
return redirect("events:detail", pk=event.pk)
else:
form = EventForm(instance=event)
return render(request, "events/edit_event.html", {"form": form, "event": event})
def delete_event(request, pk):
event = get_object_or_404(Event, pk=pk)
# Hapus event hanya setelah form dikirim, lalu kembali ke list.
return render(request, "events/delete_event.html", {"event": event})
Semua pelajaran di Formulir
Latihan sendiri: Playground Django