DeleteView
Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 13 sur 18.
Les pages de recettes ont un lien Delete. Une suppression ne doit jamais avoir lieu lors d'une simple visite : les navigateurs et les aperçus de liens ouvrent les pages de leur propre initiative. DeleteView fonctionne donc en deux étapes : GET affiche une question, et seule la requête POST de son formulaire effectue la suppression. Un site de recettes :
from django.urls import reverse_lazy
class RecipeDeleteView(DeleteView):
model = Recipe
success_url = reverse_lazy("recipes:home")Son modèle utilise par défaut recipes/recipe_confirm_delete.html : un formulaire avec method="post" et {% csrf_token %}. Après la suppression, il n'y a plus de page correspondant à la ligne où arriver ; success_url est donc obligatoire.
Utilise reverse_lazy() à cet endroit, et non reverse(). Un attribut de classe est calculé lors de l'importation de views.py, avant que les routes existent ; reverse() empêche donc le projet de démarrer. reverse_lazy() attend que l'URL soit utilisée.
Défi
FacileLe modèle jobs/job_confirm_delete.html est prêt. Créez la page derrière Delete :
- Une
JobDeleteView, uneDeleteViewdeJobqui redirige le navigateur versjobs:listaprès la suppression. - Une route
"jobs/<slug:slug>/delete/"nomméedelete.
Appuyez sur Run, ouvrez une offre d’emploi et appuyez sur Delete, puis confirmez.
Essayez vous-même
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"]
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Vues basées sur des classes
Entraînez-vous par vous-même : Playground Django