Ein Ereignis bearbeiten
Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 13 von 20.
Jede Ereignisseite hat jetzt einen Link Dieses Ereignis bearbeiten zu /events/1/edit/. Die URL, der Link und die Vorlage sind bereit, und edit_event findet bereits das Ereignis, auf das die URL verweist. Der Rest der Ansicht liegt bei dir.
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 ausgefüllt mit den aktuellen Werten der Zeile 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:
- Ein GET zeigt das Formular mit den Details der Veranstaltung ausgefüllt an.
- Ein gültiger POST speichert die Änderungen an dieser Veranstaltung, fügt keine neue hinzu und leitet zu ihrer Seite weiter.
- Ein ungültiger POST zeigt die Seite erneut mit den Fehlern an.
Die Vorlage benötigt form und event. Klicke auf Run und anschließend auf Diese Veranstaltung bearbeiten.
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, prüfe 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