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 des livres d’une année donné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})

Pour une ligne, la page l’identifie par sa clé primaire, pk : son id. Si la ligne est introuvable, get() déclenche une exception ; une exception dans une vue provoque une erreur, Erreur serveur 500. get_object_or_404() de django.shortcuts renvoie plutôt une réponse 404 Page introuvable. Elle 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

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

  • Une vue book_detail(request, pk). Un identifiant sans livre renvoie une erreur 404.
  • Une route pour /books/<id>/ nommée book_detail, qui correspond uniquement aux nombres.
  • Sur la page d’accueil, chaque titre renvoie vers sa page.

Cliquez sur Run, cliquez sur un titre, puis ouvrez /books/999/.

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