Menu
CoddyTech

Ein Zusageformular

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

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

Das RSVP-Formular fragt nach einem Namen und einer E-Mail-Adresse, niemals nach der Veranstaltung: Der Besucher befindet sich auf der Seite dieser Veranstaltung, und ein entsprechendes Feld würde es ihm ermöglichen, eine andere auszuwählen. Lass in fields weg, was die Ansicht festlegt, und setze es in der Ansicht.

form.save(commit=False) erstellt das Objekt, ohne es zu speichern, sodass du zuerst den Rest festlegen kannst. Das Bestellformular eines Geschäfts 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 Fehler IntegrityError.

challenge icon

Aufgabe

Mittel
  • Füge in events/forms.py RSVPForm hinzu, ein ModelForm für RSVP, das nur nach name und email fragt.
  • Übergib es in event_detail als form an das Template. Ein gültiger POST speichert die Anmeldung für diese Veranstaltung, fügt die Nachricht You're on the list! hinzu und leitet zur Veranstaltungsseite weiter.

Klicke auf „Ausführen“, öffne eine Veranstaltung und melde dich an.

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