Menu
CoddyTech

Une page pour chaque livre

Fait partie de la section Modèles et interface d’administration du Journey Django de Coddy. Leçon 14 sur 23.

Chaque livre a besoin d’une page à sa propre adresse : /books/1/, /books/2/. Un convertisseur de chemin, présenté dans Django Basics, capture ce nombre et le transmet à la vue. Une page présentant les livres d’une année :

path("years/<int:year>/", views.books_of_year, name="books_of_year"),

def books_of_year(request, year):
    books = Book.objects.filter(year=year)
    return render(request, "books/year.html", {"year": year, "books": books})

Une page pour une ligne la désigne par sa clé primaire, pk : son id. get() lève une exception lorsqu’aucune ligne ne correspond, et une exception dans une vue provoque un plantage, une erreur 500 du serveur. get_object_or_404() de django.shortcuts renvoie plutôt une erreur 404 : page introuvable. Cette fonction prend le modèle, puis les conditions : get_object_or_404(Book, title="Emma").

Pour créer un lien vers une route qui capture une valeur, place la valeur après le nom : {% url 'books:books_of_year' book.year %}.

challenge icon

Défi

Moyen

Attribue une page à chaque livre. Le modèle books/book_detail.html est prêt et attend book.

  1. Dans books/views.py, écris book_detail(request, pk) : cette fonction affiche le livre ayant cet identifiant, ou renvoie une réponse 404.
  2. Dans books/urls.py, fais pointer la route /books/<id>/, avec des nombres uniquement, vers cette fonction sous le nom book_detail.
  3. Dans home.html, fais de chaque titre un lien vers sa page. Seul le titre est le lien : <a ...>Dune</a> (1965).

Clique sur Dune sur la page d’accueil, puis ouvre /books/999/ : page introuvable (404).

Essayez vous-même

from django.shortcuts import render

from .models import Book


def home(request):
    books = Book.objects.all()
    return render(request, "books/home.html", {"books": books})

Toutes les leçons de Modèles et interface d’administration

Entraînez-vous par vous-même : Playground Django