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 %}.
Défi
MoyenDonnez 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éebook_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
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