Menu
CoddyTech

DeleteView

Fa parte della sezione View basate su classi del percorso Django di Coddy. Lezione 13 di 18.

Le pagine dei lavori hanno un link Delete. Una cancellazione non deve mai avvenire durante una semplice visita: i browser e le anteprime dei link aprono le pagine autonomamente. Perciò DeleteView funziona in due passaggi: GET mostra una domanda e solo la richiesta POST del relativo modulo cancella l’elemento. Un sito di ricette:

from django.urls import reverse_lazy


class RecipeDeleteView(DeleteView):
    model = Recipe
    success_url = reverse_lazy("recipes:home")

Il modello predefinito del suo template è recipes/recipe_confirm_delete.html: un modulo con method="post" e {% csrf_token %}. Dopo la cancellazione non c’è una pagina dell’elemento su cui atterrare, quindi success_url è obbligatorio.

Usa reverse_lazy() qui, non reverse(). Un attributo di classe viene calcolato quando viene importato views.py, prima che esistano le route, quindi reverse() impedisce l’avvio del progetto. reverse_lazy() aspetta finché l’URL non viene utilizzato.

challenge icon

Sfida

Facile

Il template jobs/job_confirm_delete.html è pronto. Crea la pagina dietro Delete:

  • Una JobDeleteView, una DeleteView di Job che, dopo l’eliminazione, reindirizza il browser a jobs:list.
  • Una route "jobs/<slug:slug>/delete/" chiamata delete.

Premi Run, apri un’offerta di lavoro e premi Delete, poi conferma.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di View basate su classi

Esercitati da solo: Playground Django