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.
Aufgabe
EinfachDer Link Dieses Ereignis löschen und die zugehörige Seite sind bereit.
- In
delete_eventzeigt ein GET nur die Seite an. Ein POST löscht das Ereignis und leitet zur Ereignisliste weiter. - Ersetze in
delete_event.htmlden Kommentar durch ein Formular, das Daten an diese Seite sendet, mit einer SchaltflächeDelete.
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