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. L'eliminazione non deve mai avvenire con una semplice visita: i browser e le anteprime dei link aprono le pagine da soli. Perciò DeleteView funziona in due passaggi: GET mostra una domanda e solo il POST del relativo modulo esegue l'eliminazione. Un sito di ricette:

from django.urls import reverse_lazy


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

Il template predefinito è recipes/recipe_confirm_delete.html, un file che devi scrivere. Contiene un modulo con method="post" e {% csrf_token %}, e il suo pulsante invia il POST che esegue l'eliminazione. Dopo l'eliminazione non c'è più una pagina della riga su cui atterrare, quindi success_url è obbligatorio.

Usa reverse_lazy() lì, non reverse(). Un attributo di classe viene calcolato quando si importa views.py, prima che esistano le route, quindi reverse() impedisce al progetto di avviarsi. reverse_lazy() attende finché l'URL non viene usato.

challenge icon

Sfida

Facile

Crea la pagina dietro «Elimina», usando il modello già pronto jobs/job_confirm_delete.html.

  1. In jobs/views.py, aggiungi JobDeleteView, una DeleteView di Job che reindirizzi il browser a jobs:list dopo l'eliminazione.
  2. In jobs/urls.py, aggiungi la route "jobs/<slug:slug>/delete/" chiamata delete.

Premi «Elimina» su un'offerta di lavoro: la pagina chiede prima conferma e, dopo averla confermata, l'offerta viene rimossa da /jobs/.

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