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.
Sfida
FacileCrea la pagina dietro «Elimina», usando il modello già pronto jobs/job_confirm_delete.html.
- In
jobs/views.py, aggiungiJobDeleteView, unaDeleteViewdiJobche reindirizzi il browser ajobs:listdopo l'eliminazione. - In
jobs/urls.py, aggiungi la route"jobs/<slug:slug>/delete/"chiamatadelete.
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"]
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