이벤트 삭제하기
Coddy Django 여정의 폼 섹션에 포함된 레슨. 20개 중 14번째.
링크는 GET 요청이며, GET 요청은 절대로 데이터를 변경해서는 안 됩니다. 브라우저는 링크를 미리 불러오고, 채팅 앱은 미리보기를 표시하기 위해 링크를 열며, 검색 엔진은 찾은 모든 링크를 따라갑니다. 이벤트를 삭제하는 링크가 있다면, 누군가가 삭제를 결정하기도 전에 이벤트가 삭제될 수 있습니다.
따라서 변경 작업은 두 단계로 이루어집니다. GET 요청은 확인을 요청하는 페이지를 보여 주고, 폼의 버튼으로 전송되는 POST 요청은 작업을 수행합니다. 청구서 앱에서 청구서를 결제 완료로 표시하는 예입니다.
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})확인 폼에는 필드가 필요 없고 토큰과 버튼만 있으면 됩니다. action이 없는 폼은 현재 페이지로 전송됩니다. 행의 .delete()는 해당 행을 삭제합니다. 삭제한 다음에는 여전히 존재하는 페이지로 리디렉션하세요.
챌린지
쉬움이 이벤트 삭제 링크와 해당 페이지가 준비되었습니다:
delete_event에서 GET 요청은 페이지를 표시하기만 합니다. POST 요청은 이벤트를 삭제하고 이벤트 목록으로 리디렉션합니다.delete_event.html에서 이 페이지로 전송하는 폼과Delete버튼을 추가합니다.
실행을 누르고 이벤트를 연 다음 삭제하세요.
직접 해보기
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)
# 폼이 제출되었을 때만 이벤트를 삭제한 다음 목록으로 돌아갑니다.
return render(request, "events/delete_event.html", {"event": event})
폼의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드