이벤트 수정하기
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에서 인스턴스를 빠뜨리면 저장할 때 복사본이 추가됩니다.
챌린지
쉬움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})
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
폼의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드