Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel

Erstelle eine Autorenseite.

  1. Schreibe in books/views.py die Funktion author_list: Rendere books/author_list.html mit allen Autoren und verwende dabei prefetch_related().
  2. Füge in books/urls.py authors/ mit dem Namen authors hinzu.
  3. Gib in author_list.html jedem Autor eine <section class="author">: den Namen in einem <h2> und ein <li> pro Buch, dessen Titel auf die Buchseite verlinkt.
  4. 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