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.
Défi
FacileCréez la page derrière Delete, avec le modèle prêt à l’emploi jobs/job_confirm_delete.html.
- Dans
jobs/views.py, ajoutezJobDeleteView, uneDeleteViewdeJobqui redirige le navigateur versjobs:listaprès la suppression. - Dans
jobs/urls.py, ajoutez la route"jobs/<slug:slug>/delete/"nomméedelete.
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"]
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