Xóa sự kiện
Thuộc phần Biểu mẫu trong hành trình Django của Coddy. Bài học 14 trên 20.
Một liên kết dùng GET, và GET tuyệt đối không được thay đổi dữ liệu. Trình duyệt tải trước các liên kết, ứng dụng trò chuyện mở chúng để tạo bản xem trước, còn công cụ tìm kiếm theo mọi liên kết mà chúng tìm thấy. Một liên kết xóa sự kiện sẽ xóa sự kiện đó mà không cần ai quyết định.
Vì vậy, một thao tác thay đổi cần hai bước: GET hiển thị trang yêu cầu xác nhận, còn POST, được gửi bằng nút trong biểu mẫu, sẽ thực hiện thao tác. Ví dụ, ứng dụng thanh toán đánh dấu hóa đơn là đã thanh toán:
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})Biểu mẫu xác nhận không cần trường nào, chỉ cần token và một nút; biểu mẫu không có action sẽ gửi POST đến chính trang đang mở. Sau khi xóa, hãy chuyển hướng đến một trang vẫn còn tồn tại.
Thử thách
DễLiên kết Delete this event và trang của liên kết đã sẵn sàng.
- Trong
delete_event, GET chỉ hiển thị trang. POST xóa sự kiện rồi chuyển hướng đến danh sách sự kiện. - Trong
delete_event.html, thay chú thích bằng biểu mẫu gửi dữ liệu đến trang này, có nútDelete.
Nhấn Delete: bạn sẽ đến trang chủ và Friday Jazz Night sẽ biến mất.
Tự làm thử
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)
# Chỉ xóa sự kiện khi biểu mẫu được gửi, rồi quay lại danh sách.
return render(request, "events/delete_event.html", {"event": event})
Tất cả bài học trong Biểu mẫu
Tự luyện tập: Playground Django