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 possède une page par livre, mais aucune pour les auteurs. Ce projet en crée une à partir de ce que vous savez déjà : une vue qui interroge la base de données, une URL, un modèle qui suit les relations et un QuerySet qui n’exécute 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 intérieure exécute une requête par auteur. select_related() ne peut pas aider, car aller d’un auteur à ses livres revient à remonter la relation. Son partenaire, prefetch_related(), récupère les lignes associées à chaque objet de la liste avec une requête supplémentaire.
La consigne indique ce que la page doit faire ; le code est à vous.
Défi
MoyenCréez une page Auteurs à l’adresse /authors/, avec le nom d’URL authors :
- Chaque auteur a une
<section class="author">avec son nom dans un<h2>et des liens vers chacun de ses livres. - La page exécute le même petit nombre de requêtes, quel que soit le nombre d’auteurs.
- L’en-tête dans
books/base.htmly renvoie avec le libelléAuthors.
Cliquez sur Exécuter, puis sur Authors.
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