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.
Aufgabe
Mittel- Füge in
events/forms.pyRSVPFormhinzu, ein ModelForm fürRSVP, das nur nachnameundemailfragt. - Übergib es in
event_detailalsforman das Template. Ein gültiger POST speichert die Anmeldung für diese Veranstaltung, fügt die NachrichtYou'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