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.
Sfida
FacileIl template jobs/job_confirm_delete.html è pronto. Crea la pagina dietro Delete:
- Una
JobDeleteView, unaDeleteViewdiJobche, dopo l’eliminazione, reindirizza il browser ajobs:list. - Una route
"jobs/<slug:slug>/delete/"chiamatadelete.
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"]
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