Menu
CoddyTech

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 hinzu

Ohne 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.

challenge icon

Aufgabe

Einfach

Vervollstä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})
quiz iconTeste dich selbst

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