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 %}.
Défi
MoyenAttribue une page à chaque livre. Le modèle books/book_detail.html est prêt et attend book.
- Dans
books/views.py, écrisbook_detail(request, pk): cette fonction affiche le livre ayant cet identifiant, ou renvoie une réponse 404. - Dans
books/urls.py, fais pointer la route/books/<id>/, avec des nombres uniquement, vers cette fonction sous le nombook_detail. - 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
3Des pages issues de la base de données
Une liste issue de la base de donnéesUne page pour chaque livreEntraînez-vous par vous-même : Playground Django