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 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.

challenge icon

Défi

Facile

Le modèle jobs/job_confirm_delete.html est prêt. Créez la page derrière Delete :

  • Une JobDeleteView, une DeleteView de Job qui redirige le navigateur vers jobs:list après la suppression.
  • Une route "jobs/<slug:slug>/delete/" nommée delete.

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"]
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