Menu
CoddyTech

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 hinzu

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

challenge icon

Aufgabe

Einfach

Vervollstä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})
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