La page des auteurs
Fait partie de la section Modèles et interface d’administration du Journey Django de Coddy. Leçon 22 sur 23.
Votre bibliothèque comporte une page par livre, mais aucune pour les auteurs. Ce projet en crée une à partir de ce que vous savez : une vue qui interroge la base de données, une URL, un modèle qui suit les relations et un QuerySet qui ne lance pas une requête par ligne.
Chaque auteur est affiché avec ses livres : une boucle parcourt les auteurs et, à l’intérieur, une autre boucle parcourt les livres de chaque auteur. Sans aide, la boucle interne lance une requête par auteur. select_related() ne peut pas aider, car la relation entre un auteur et ses livres est une relation inverse. Son équivalent, prefetch_related(), récupère les lignes associées à chaque objet de la liste avec une requête supplémentaire. Book.objects.prefetch_related("loans") récupère les prêts de chaque livre avec une requête supplémentaire. Cette méthode prend le nom de la relation.
La consigne indique ce que la page doit faire ; le code, c’est vous qui l’écrivez.
Défi
MoyenCréez une page Auteurs.
- Dans
books/views.py, écrivezauthor_list: affichezbooks/author_list.htmlavec tous les auteurs, en utilisantprefetch_related(). - Dans
books/urls.py, ajoutezauthors/avec le nomauthors. - Dans
author_list.html, donnez à chaque auteur une<section class="author">: le nom dans un<h2>, et un<li>par livre, dont le titre renvoie vers sa page. - Dans
books/base.html, ajoutez un lien « Auteurs » dans le<header>.
Cliquez sur « Auteurs » : Herbert affiche Children of Dune et Dune.
Essayez vous-même
from django.shortcuts import get_object_or_404, render
from .models import Book
def home(request):
books = Book.objects.select_related("author")
return render(request, "books/home.html", {"books": books})
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk)
return render(request, "books/book_detail.html", {"book": book})
def search(request):
q = request.GET.get("q", "")
books = Book.objects.filter(title__icontains=q).select_related("author")
return render(request, "books/search.html", {"q": q, "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