Menu
CoddyTech

바인딩된 폼과 바인딩되지 않은 폼

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

날짜를 next friday로 입력해 양식을 제출해 보세요. 페이지가 다시 열리지만 “양식을 확인해 주세요.”라는 문구만 있고 내용은 비어 있습니다. 뷰는 입력한 내용이 담긴 양식을 확인한 다음, 그 양식을 버리고 새 빈 양식을 그렸습니다.

데이터를 넣어 만든 양식은 바인딩된 양식입니다. ContactForm(request.POST)에는 방문자가 입력한 내용이 담기고, is_valid()를 실행하면 오류도 담깁니다. ContactForm()은 바인딩되지 않은 양식입니다. 비어 있고 오류도 없습니다. {{ form }}으로 그리면 바인딩된 양식에는 각 입력값이 표시되고, 잘못 입력된 필드 옆에는 Enter a valid date.와 같은 오류가 표시됩니다.

따라서 양식을 사용하는 뷰에는 세 가지 경우가 있습니다.

  • GET 요청: 바인딩되지 않은 양식을 렌더링합니다.
  • 실패한 POST 요청: 확인한 바인딩된 양식을 렌더링합니다.
  • 성공한 POST 요청: 저장하고 리디렉션합니다.

마지막에 render()를 한 번 호출하면 처음 두 경우를 처리할 수 있습니다.

challenge icon

챌린지

쉬움

오류가 발생한 뒤에도 방문자가 입력한 내용을 유지하세요.

  1. new_event에서 POST 요청이 실패하면 확인을 마친 폼을 렌더링하고, GET 요청이면 빈 EventForm을 렌더링하세요.
  2. 뷰와 new_event.html에서 error 메시지를 제거하세요. 이제 폼에 자체 오류가 표시됩니다.

날짜로 다음 주 금요일을 입력하세요. 제목은 그대로 유지되고, 날짜 입력란 위에 유효한 날짜를 입력하세요.라는 메시지가 표시됩니다.

직접 해보기

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()})
quiz icon실력 점검

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

폼의 모든 레슨

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