Menu
CoddyTech

Ein Ereignis löschen

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

Ein Link ist eine GET-Anfrage, 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 gelöscht hätte, 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 nachfragt, 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 die Anfrage an die Seite, auf der es sich befindet. Leite nach dem Löschen zu einer Seite weiter, die weiterhin existiert.

challenge icon

Aufgabe

Einfach

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

  1. In delete_event zeigt ein GET nur die Seite an. Ein POST löscht das Ereignis und leitet zur Ereignisliste weiter.
  2. Ersetze in delete_event.html den Kommentar durch ein Formular, das Daten an diese Seite sendet, mit einer Schaltfläche Delete.

Drücke auf „Löschen“: Du landest auf der Startseite, und Friday Jazz Night ist verschwunden.

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 Event erst, wenn das Formular abgeschickt 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