Menu
CoddyTech

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 icon

Challenge

Medium
  • In events/forms.py, add RSVPForm, a ModelForm for RSVP asking for name and email only.
  • In event_detail, pass it to the template as form. A valid POST saves the RSVP for this event, adds the message You'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