Ein Ereignis bearbeiten
Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 13 von 20.
Auf jeder Ereignisseite gibt es jetzt einen Link Dieses Ereignis bearbeiten zu /events/1/edit/. Die URL, der Link und das Template sind bereit, und edit_event findet bereits das Ereignis, das in der URL angegeben ist. Den Rest der View übernimmst du.
Ein ModelForm bearbeitet eine vorhandene Zeile, wenn du ihm diese Zeile als instance übergibst. Für eine Notiz in einer Notiz-App:
note = get_object_or_404(Note, pk=4)
form = NoteForm(instance=note) # mit den Werten der Notiz ausgefüllt
form = NoteForm(request.POST, instance=note) # die neuen Werte für diese Notiz
if form.is_valid():
form.save() # aktualisiert Notiz 4, fügt keine Zeile hinzuOhne Daten zeigt NoteForm(instance=note) das Formular mit den aktuellen Werten der Zeile ausgefüllt an. Mit Daten sorgt instance=note dafür, dass form.save() diese Zeile aktualisiert, statt eine neue zu erstellen.
Eine Bearbeitungsseite benötigt beides. Vergisst du die Instanz beim GET, sieht der Besucher ein leeres Formular; vergisst du sie beim POST, wird beim Speichern eine Kopie hinzugefügt.
Aufgabe
EinfachVervollständige edit_event in events/views.py, indem du den Kommentar ersetzt. Das render() am Ende übergibt bereits event; füge daneben form hinzu.
- Bei einem GET wird das Formular mit den Details der Veranstaltung ausgefüllt angezeigt.
- Ein gültiger POST speichert die Änderungen, fügt keine neue Veranstaltung hinzu und leitet zu deren Seite weiter.
- Bei einem ungültigen POST wird die Seite erneut mit den Fehlern angezeigt.
Ändere „Ort“ in Town Hall und klicke auf „Änderungen speichern“: Auf der Seite der Veranstaltung steht Town Hall.
Probier es selbst
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()
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)
# Erstelle das Formular für dieses Event, validiere es und speichere es, wie in new_event.
return render(request, "events/edit_event.html", {"event": event})
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Formulare
Übe selbstständig: Django-Playground