참석 회신 양식
Coddy Django 여정의 폼 섹션에 포함된 레슨. 20개 중 16번째.
방문자는 자신이 참석한다고 알리고 싶어 합니다. 프로젝트에는 Event에 대한 ForeignKey(related_name="rsvps")가 있는 새로운 RSVP 모델이 있으며, 각 이벤트 페이지에는 참석하시나요?라는 제목 아래에 양식이 있습니다.
RSVP 양식은 이름과 이메일을 묻지만 이벤트는 묻지 않습니다. 방문자는 해당 이벤트 페이지에 있으므로, 이벤트 필드를 두면 다른 이벤트를 선택할 수 있습니다. 이벤트를 fields에서 제외하고, 대신 뷰에서 설정하세요.
form.save(commit=False)는 저장하지 않고 객체를 만들기 때문에 나머지 값을 먼저 설정할 수 있습니다. 상점의 주문 양식에서는 상태를 묻지 않습니다.
form = OrderForm(request.POST)
if form.is_valid():
order = form.save(commit=False)
order.status = "new"
order.save()일반적인 form.save()는 행을 즉시 저장하며, 필수 ForeignKey를 비워 두면 IntegrityError가 발생합니다.
챌린지
중급방문자가 참석 신청을 할 수 있게 하세요.
events/forms.py에서RSVP를 위한RSVPFormModelForm을 작성하고,name과email만 포함하세요.event_detail에서RSVPForm을form으로 페이지에 전달하세요. POST 요청이 오면request.POST로 폼을 만드세요.- 유효하면
commit=False로 저장하고, 해당 이벤트를 설정한 다음 저장하세요.You're on the list!메시지를 추가하고 이벤트 페이지로 리디렉션하세요. 유효하지 않으면 폼을 다시 표시하세요.
Friday Jazz Night에 참석 신청하면 You're on the list!가 표시됩니다.
직접 해보기
from django.contrib import messages
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()
messages.success(request, "Your event was added.")
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()
messages.success(request, "Your changes were saved.")
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)
if request.method == "POST":
event.delete()
messages.success(request, "The event was deleted.")
return redirect("events:list")
return render(request, "events/delete_event.html", {"event": event})
폼의 모든 레슨
직접 연습해 보세요: Django 플레이그라운드