An RSVP Form
Part of the Forms section of Coddy's Django journey. Lesson 16 of 20.
Visitors want to say they are coming. The project has a new RSVP model with a ForeignKey to Event (related_name="rsvps"), and each event page has a form under Coming?.
The RSVP form asks for a name and an email, never for the event: the visitor is on that event's page, and a field would let them pick another. Leave out of fields what the view decides, and set it in the view.
form.save(commit=False) builds the object without saving it, so you can set the rest first. A shop's order form never asks for the status:
form = OrderForm(request.POST)
if form.is_valid():
order = form.save(commit=False)
order.status = "new"
order.save()A plain form.save() stores the row at once, and a required ForeignKey left empty crashes with IntegrityError.
Challenge
Medium- In
events/forms.py, addRSVPForm, a ModelForm forRSVPasking fornameandemailonly. - In
event_detail, pass it to the template asform. A valid POST saves the RSVP for this event, adds the messageYou're on the list!and redirects to the event's page.
Press Run, open an event and RSVP.
Try it yourself
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})
All lessons in Forms
Practice on your own: Django playground