Menu
CoddyTech

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.

challenge icon

Aufgabe

Einfach

Die Vorlage jobs/job_confirm_delete.html ist bereit. Erstelle die Seite hinter Delete:

  • Eine JobDeleteView, eine DeleteView für Job, die den Browser nach dem Löschen zu jobs:list weiterleitet.
  • Eine Route "jobs/<slug:slug>/delete/" namens delete.

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"]
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Klassenbasierte Views

Übe selbstständig: Django-Playground