Menu
CoddyTech

DeleteView

Fait partie de la section Vues basées sur des classes du Journey Django de Coddy. Leçon 13 sur 18.

Les pages d’offres d’emploi ont un lien Delete. Une suppression ne doit jamais se produire lors d’une simple visite : les navigateurs et les aperçus de liens ouvrent les pages automatiquement. DeleteView fonctionne donc en deux étapes : GET affiche une question, et seul le 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")

Par défaut, son modèle utilise recipes/recipe_confirm_delete.html, un fichier que vous devez écrire. Il contient un formulaire avec method="post" et {% csrf_token %}, et son bouton envoie le POST qui effectue la suppression. Après la suppression, il n’y a plus de page de ligne où arriver, donc success_url est obligatoire.

Utilisez reverse_lazy() à cet endroit, et non reverse(). Un attribut de classe est calculé lors de l’importation de views.py, avant que les routes n’existent, donc reverse() empêche le projet de démarrer. reverse_lazy() attend que l’URL soit utilisée.

challenge icon

Défi

Facile

Créez la page derrière Delete, avec le modèle prêt à l’emploi jobs/job_confirm_delete.html.

  1. Dans jobs/views.py, ajoutez JobDeleteView, une DeleteView de Job qui redirige le navigateur vers jobs:list après la suppression.
  2. Dans jobs/urls.py, ajoutez la route "jobs/<slug:slug>/delete/" nommée delete.

Cliquez sur Delete pour une offre d’emploi : la page demande d’abord confirmation, et celle-ci la supprime de /jobs/.

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"]
quiz iconTestez-vous

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