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 pro Buch, aber keine für Autorinnen und Autoren. Dieses Projekt erstellt eine anhand dessen, was du bereits weißt: eine View, die die Datenbank abfragt, eine URL, ein Template, das Beziehungen durchläuft, und ein QuerySet, das nicht für jede Zeile eine Abfrage ausführt.

Jede Autorin und jeder Autor wird mit den eigenen Büchern aufgelistet: eine Schleife über die Autorinnen und Autoren und darin eine Schleife über die Bücher der jeweiligen Person. Ohne Hilfe führt die innere Schleife eine Abfrage pro Autorin oder Autor aus. select_related() hilft nicht, denn vom Autor zu seinen Büchern geht es in die Rückwärtsrichtung. Das Gegenstück, prefetch_related(), ruft die zugehörigen Zeilen aller Objekte in der Liste mit einer zusätzlichen Abfrage ab.

Die Aufgabe gibt vor, was die Seite tun muss; der Code ist deine Sache.

challenge icon

Aufgabe

Mittel

Erstelle eine Autorenseite unter /authors/ mit dem URL-Namen authors:

  • Jeder Autor erhält eine <section class="author"> mit seinem Namen in einem <h2> und Links zu all seinen Büchern.
  • Die Seite führt unabhängig von der Anzahl der Autoren dieselben wenigen Abfragen aus.
  • Der Header in books/base.html verlinkt darauf mit Authors.

Klicke auf „Run“ und dann auf „Authors“.

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