이벤트 삭제하기
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이 없는 폼은 현재 페이지로 POST를 전송합니다. 삭제한 뒤에는 여전히 존재하는 페이지로 리디렉션하세요.
챌린지
쉬움이 이벤트 삭제 링크와 해당 페이지가 준비되었습니다.
delete_event에서 GET 요청은 페이지를 표시하기만 합니다. POST 요청은 이벤트를 삭제하고 이벤트 목록으로 리디렉션합니다.delete_event.html에서 주석을 이 페이지에 POST하는 양식으로 바꾸고,Delete버튼을 추가하세요.
Delete를 누르면 홈 페이지로 이동하고 Friday Jazz Night 이벤트가 사라집니다.
직접 해보기
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 플레이그라운드