Menu
CoddyTech

Ein Ereignis löschen

Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 14 von 20.

Ein Link löst eine GET-Anfrage aus, und eine GET-Anfrage darf niemals Daten ändern. Browser laden Links im Voraus, Chat-Apps öffnen sie, um eine Vorschau anzuzeigen, und Suchmaschinen folgen jedem Link, den sie finden. Ein Link, der ein Ereignis löschte, würde es löschen, ohne dass jemand sich dafür entschieden hätte.

Eine Änderung erfolgt also in zwei Schritten: Eine GET-Anfrage zeigt eine Seite an, die nach einer Bestätigung fragt, und eine POST-Anfrage, die über eine Schaltfläche in einem Formular gesendet wird, führt die Aktion aus. Eine Abrechnungs-App, die eine Rechnung als bezahlt markiert:

def pay_invoice(request, pk):
    invoice = get_object_or_404(Invoice, pk=pk)
    if request.method == "POST":
        invoice.paid = True
        invoice.save()
        return redirect("bills:invoice", pk=invoice.pk)
    return render(request, "bills/confirm_pay.html", {"invoice": invoice})

Das Bestätigungsformular benötigt keine Felder, sondern nur das Token und eine Schaltfläche; ein Formular ohne action sendet seine Daten an die Seite, auf der es sich befindet. .delete() entfernt einen Datensatz. Leite nach dem Löschen auf eine Seite weiter, die noch existiert.

challenge icon

Aufgabe

Einfach

Der Link Dieses Ereignis löschen und die zugehörige Seite sind bereit:

  • In delete_event zeigt eine GET-Anfrage nur die Seite an. Eine POST-Anfrage löscht das Ereignis und leitet zur Ereignisliste weiter.
  • Füge in delete_event.html ein Formular hinzu, das Daten an diese Seite sendet, mit einer Schaltfläche Delete.

Klicke auf „Run“, öffne ein Ereignis und lösche es.

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)
    if request.method == "POST":
        form = EventForm(request.POST, instance=event)
        if form.is_valid():
            form.save()
            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)
    # Lösche das Ereignis erst, wenn das Formular abgesendet wurde, und kehre dann zur Liste zurück.
    return render(request, "events/delete_event.html", {"event": event})

Alle Lektionen in Formulare

Übe selbstständig: Django-Playground