Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Cré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.html y 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

Entraînez-vous par vous-même : Playground Django