Menu
CoddyTech

Ein Zusageformular

Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 16 von 20.

Besucher möchten sagen, dass sie kommen. Das Projekt hat ein neues RSVP-Modell mit einem ForeignKey zu Event (related_name="rsvps"), und jede Ereignisseite hat ein Formular unter der Überschrift Kommst du?

Das RSVP-Formular fragt nach einem Namen und einer E-Mail-Adresse, niemals nach dem Ereignis: Der Besucher ist auf der Seite dieses Ereignisses, und ein Feld würde ihm erlauben, ein anderes auszuwählen. Lass das Ereignis aus fields heraus und setze es stattdessen in der View.

form.save(commit=False) erstellt das Objekt, ohne es zu speichern, damit du zuerst den Rest festlegen kannst. Das Bestellformular eines Shops fragt niemals nach dem Status:

form = OrderForm(request.POST)
if form.is_valid():
    order = form.save(commit=False)
    order.status = "new"
    order.save()

Ein einfaches form.save() speichert den Datensatz sofort, und ein erforderlicher, leer gelassener ForeignKey führt zu einem IntegrityError.

challenge icon

Aufgabe

Mittel

Lass Besucher ihre Teilnahme anmelden.

  1. Schreibe in events/forms.py ein ModelForm RSVPForm für RSVP, das nur name und email enthält.
  2. Übergib in event_detail ein RSVPForm als form an die Seite. Erstelle es bei einem POST aus request.POST.
  3. Wenn das Formular gültig ist, speichere es mit commit=False, setze sein Event, speichere es, füge You're on the list! hinzu und leite zum Event weiter. Andernfalls zeige das Formular erneut an.

Melde dich für Friday Jazz Night an: Du siehst „Du stehst auf der Liste!“

Probier es selbst

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})

Alle Lektionen in Formulare

Übe selbstständig: Django-Playground