Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Tautan 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 tombol Delete.

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