DeleteView
Teil des Abschnitts Klassenbasierte Views der Django-Journey von Coddy. Lektion 13 von 18.
Jobseiten haben einen Link Delete. Ein Löschvorgang darf niemals bei einem einfachen Seitenaufruf stattfinden: Browser und Linkvorschauen öffnen Seiten eigenständig. Daher funktioniert DeleteView in zwei Schritten: Bei GET wird eine Frage angezeigt, und nur der POST aus dem Formular löscht den Eintrag. 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: ein Formular mit method="post" und {% csrf_token %}. Nach dem Löschen gibt es keine Seite zum gelöschten Eintrag, 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() den Start des Projekts. reverse_lazy() wartet, bis die URL verwendet wird.
Aufgabe
EinfachDie Vorlage jobs/job_confirm_delete.html ist bereit. Erstelle die Seite hinter Delete:
- Eine
JobDeleteView, eineDeleteViewfürJob, die den Browser nach dem Löschen zujobs:listweiterleitet. - Eine Route
"jobs/<slug:slug>/delete/"namensdelete.
Klicke auf „Run“, öffne einen Job und klicke auf „Delete“, bestätige anschließend.
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