DeleteView
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 13 von 18.
Jobseiten haben einen Delete-Link. Das Löschen darf niemals bei einem einfachen Aufruf erfolgen: Browser und Linkvorschauen öffnen Seiten von selbst. Deshalb funktioniert DeleteView in zwei Schritten: GET zeigt eine Frage an, und nur das POST aus dem Formular löscht. Eine Rezeptseite:
from django.urls import reverse_lazy
class RecipeDeleteView(DeleteView):
model = Recipe
success_url = reverse_lazy("recipes:home")Die Vorlage verwendet standardmäßig recipes/recipe_confirm_delete.html, eine Datei, die du schreibst. Sie enthält ein Formular mit method="post" und {% csrf_token %}, und dessen Schaltfläche sendet das POST, das den Eintrag löscht. Nach dem Löschen gibt es keine Zeilenseite, auf der man landen könnte, daher ist success_url erforderlich.
Verwende dort reverse_lazy(), nicht reverse(). Ein Klassenattribut wird berechnet, wenn views.py importiert wird, bevor die Routen existieren. Daher verhindert reverse(), dass das Projekt startet. reverse_lazy() wartet, bis die URL verwendet wird.
Aufgabe
EinfachErstelle die Seite hinter Delete mit der fertigen Vorlage jobs/job_confirm_delete.html.
- Füge in
jobs/views.pyJobDeleteViewhinzu, eineDeleteViewfürJob, die den Browser nach dem Löschen zujobs:listweiterleitet. - Füge in
jobs/urls.pydie Route"jobs/<slug:slug>/delete/"mit dem Namendeletehinzu.
Klicke bei einem Job auf „Löschen“: Die Seite fragt zuerst nach, und nach der Bestätigung wird der Job aus /jobs/ entfernt.
Probier es selbst
from django.views.generic import CreateView, DetailView, ListView, TemplateView, UpdateView
from .models import Job
class HomeView(TemplateView):
template_name = "jobs/home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["count"] = Job.objects.count()
context["latest"] = Job.objects.order_by("-posted").first()
return context
class AboutView(TemplateView):
template_name = "jobs/about.html"
class JobListView(ListView):
model = Job
context_object_name = "jobs"
ordering = ["-posted"]
paginate_by = 5
def get_queryset(self):
jobs = super().get_queryset()
city = self.request.GET.get("city")
if city:
jobs = jobs.filter(city=city)
return jobs
class JobDetailView(DetailView):
model = Job
class JobCreateView(CreateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
class JobUpdateView(UpdateView):
model = Job
fields = ["title", "company", "city", "salary", "description"]
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Klassenbasierte Views
4Ansichten bearbeiten
CreateViewAuf der neuen Stelle landenÜbe selbstständig: Django-Playground