Menu
CoddyTech

이벤트 삭제하기

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()는 해당 행을 삭제합니다. 삭제한 다음에는 여전히 존재하는 페이지로 리디렉션하세요.

challenge icon

챌린지

쉬움

이 이벤트 삭제 링크와 해당 페이지가 준비되었습니다:

  • 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 플레이그라운드