Menu
CoddyTech

이벤트 수정하기

Coddy Django 여정의 폼 섹션에 포함된 레슨. 20개 중 13번째.

이제 각 이벤트 페이지에 이 이벤트 편집 링크가 있으며, 링크는 /events/1/edit/로 연결됩니다. URL, 링크, 템플릿은 준비되어 있고, edit_event는 URL에 지정된 이벤트를 이미 찾습니다. 나머지 뷰는 여러분이 완성하면 됩니다.

ModelForm에 기존 행을 instance로 전달하면 해당 행을 수정합니다. 메모 앱에서 메모를 수정하는 경우는 다음과 같습니다.

note = get_object_or_404(Note, pk=4)

form = NoteForm(instance=note)                # 해당 노트의 값으로 채워짐

form = NoteForm(request.POST, instance=note)  # 이 노트에 적용할 새 값
if form.is_valid():
    form.save()                               # 노트 4를 업데이트하고 새 행은 추가하지 않음

데이터가 없으면 NoteForm(instance=note)은 현재 행의 값이 채워진 양식을 표시합니다. 데이터가 있으면 instance=note가 form.save()를 통해 새 행을 만드는 대신 해당 행을 업데이트하게 합니다.

편집 페이지에는 두 가지가 모두 필요합니다. GET에서 인스턴스를 빠뜨리면 방문자에게 빈 양식이 표시되고, POST에서 인스턴스를 빠뜨리면 저장할 때 복사본이 추가됩니다.

challenge icon

챌린지

쉬움

events/views.py의 edit_event를 완성하세요:

  • GET 요청은 이벤트 세부 정보가 채워진 양식을 표시합니다.
  • 유효한 POST 요청은 이 이벤트의 변경 사항을 저장하고, 새 이벤트를 추가하지 않으며, 해당 페이지로 리디렉션합니다.
  • 유효하지 않은 POST 요청은 오류와 함께 페이지를 다시 표시합니다.

템플릿에는 form과 event가 필요합니다. Run을 누른 다음 Edit this event를 누르세요.

직접 해보기

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)
    # new_event처럼 이 이벤트의 폼을 만들고, 유효성을 검사한 뒤 저장합니다.
    return render(request, "events/edit_event.html", {"event": event})
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

폼의 모든 레슨

직접 연습해 보세요: Django 플레이그라운드