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.
Aufgabe
MittelLass Besucher ihre Teilnahme anmelden.
- Schreibe in
events/forms.pyein ModelFormRSVPFormfürRSVP, das nurnameundemailenthält. - Übergib in
event_detaileinRSVPFormalsforman die Seite. Erstelle es bei einem POST ausrequest.POST. - Wenn das Formular gültig ist, speichere es mit
commit=False, setze sein Event, speichere es, fügeYou'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