바인딩된 폼과 바인딩되지 않은 폼
Coddy Django 여정의 폼 섹션에 포함된 레슨. 20개 중 7번째.
날짜를 next friday로 입력해 양식을 제출해 보세요. 페이지가 비어 있는 상태로 돌아오고, "Please check the form."만 표시됩니다. 뷰는 비어 있는 새 양식을 만들었지만, 검사한 양식에는 입력 내용이 들어 있었습니다.
데이터로 만든 양식은 바인딩된 양식입니다. ContactForm(request.POST)에는 방문자가 입력한 내용이 담기고, is_valid()를 실행한 뒤에는 오류도 담깁니다. ContactForm()은 바인딩되지 않은 양식으로, 비어 있고 오류도 없습니다. {{ form }}으로 렌더링하면 바인딩된 양식에는 각 입력값이 표시되고, 잘못된 필드 아래에는 Enter a valid date.와 같은 오류가 표시됩니다.
따라서 양식을 사용하는 뷰에는 세 가지 경우가 있습니다.
- GET 요청: 바인딩되지 않은 양식을 렌더링합니다.
- 실패한 POST 요청: 검사한 바인딩된 양식을 렌더링합니다.
- 성공한 POST 요청: 저장한 다음 리디렉션합니다.
마지막에 render()를 한 번 호출하면 앞의 두 경우를 처리할 수 있습니다.
챌린지
쉬움new_event에서는 POST가 실패한 후 검증된 폼을 렌더링하고, GET 요청에는 빈 폼을 렌더링합니다.- 뷰와
new_event.html에서error메시지를 제거합니다. 이제 폼 자체에 오류가 표시됩니다.
실행을 누르고 날짜를 next friday로 입력해 폼을 제출한 다음, 날짜 아래를 확인하세요.
직접 해보기
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):
error = None
if request.method == "POST":
form = EventForm(request.POST)
if form.is_valid():
event = Event.objects.create(
title=form.cleaned_data["title"],
date=form.cleaned_data["date"],
place=form.cleaned_data["place"],
)
return redirect("events:detail", pk=event.pk)
error = "Please check the form."
return render(request, "events/new_event.html", {"error": error, "form": EventForm()})
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
폼의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드