Die Autorenseite
Teil des Abschnitts Modelle und Admin-Bereich der Django-Journey von Coddy. Lektion 22 von 23.
Dein Bücherregal hat eine Seite für jedes Buch, aber keine für Autorinnen und Autoren. Dieses Projekt erstellt eine anhand dessen, was du weißt: eine Ansicht, die die Datenbank abfragt, eine URL, eine Vorlage, die Beziehungen verfolgt, und ein QuerySet, das nicht für jede Zeile eine Abfrage ausführt.
Jede Autorin und jeder Autor wird mit den jeweiligen Büchern aufgelistet: eine Schleife über die Autorinnen und Autoren und darin eine Schleife über die Bücher jeder einzelnen Person. Ohne Unterstützung führt die innere Schleife eine Abfrage pro Person aus. select_related() hilft hier nicht, denn die Beziehung von einer Autorin oder einem Autor zu den Büchern ist eine umgekehrte Beziehung. Das Gegenstück, prefetch_related(), ruft die verknüpften Zeilen aller Objekte in der Liste mit einer zusätzlichen Abfrage ab. Book.objects.prefetch_related("loans") ruft die Ausleihen aller Bücher mit einer zusätzlichen Abfrage ab. Dabei wird der Name der Beziehung verwendet.
Die Aufgabe beschreibt, was die Seite tun muss; der Code stammt von dir.
Aufgabe
MittelErstelle eine Autorenseite.
- Schreibe in
books/views.pydie Funktionauthor_list: Renderebooks/author_list.htmlmit allen Autoren und verwende dabeiprefetch_related(). - Füge in
books/urls.pyauthors/mit dem Namenauthorshinzu. - Gib in
author_list.htmljedem Autor eine<section class="author">: den Namen in einem<h2>und ein<li>pro Buch, dessen Titel auf die Buchseite verlinkt. - Verlinke in
books/base.html„Authors“ im<header>.
Klicke auf „Authors“: Bei Herbert werden Children of Dune und Dune aufgelistet.
Probier es selbst
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})
Alle Lektionen in Modelle und Admin-Bereich
Übe selbstständig: Django-Playground