Menu
CoddyTech

DetailView

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

Chaque emploi a besoin de sa propre page : trouver l’emploi, l’afficher et répondre par une erreur 404 Page non trouvée lorsqu’il n’existe pas d’emploi correspondant. C’est le rôle de DetailView. Sur un site de recettes :

class RecipeDetailView(DetailView):
    model = Recipe


# urls.py
path("recipes/<int:pk>/", views.RecipeDetailView.as_view(), name="recipe")

Une DetailView lit la clé primaire de la ligne dans l’argument d’URL nommé pk et recherche la ligne comme le fait get_object_or_404(). Son modèle utilise par défaut recipes/recipe_detail.html, et la ligne est accessible sous les noms object et recipe.

Le nom pk est important. Une route écrite <int:id> transmet à la vue un argument qu’elle ne recherche pas, et la page plante avec une AttributeError indiquant qu’elle attend un pk d’objet ou un slug.

Un lien transmet le pk de la ligne au nom de la route : {% url 'recipes:recipe' recipe.pk %}.

challenge icon

Défi

Facile

Attribue à chaque offre d’emploi sa propre page, avec le modèle prêt à l’emploi jobs/job_detail.html.

  1. Dans jobs/views.py, ajoute JobDetailView, une DetailView de Job.
  2. Dans jobs/urls.py, ajoute la route "jobs/<int:pk>/" nommée detail.
  3. Dans job_list.html, transforme le titre de chaque offre d’emploi en lien vers sa page.

Clique sur Python Developer pour ouvrir sa page, puis ouvre /jobs/999/ : tu vois « Page introuvable » (404).

Essayez vous-même

from django.views.generic import ListView, TemplateView

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