Menu
CoddyTech

Eine Seite für jedes Buch

Teil des Abschnitts Modelle und Admin-Bereich der Django-Journey von Coddy. Lektion 14 von 23.

Jedes Buch benötigt eine Seite unter einer eigenen Adresse: /books/1/, /books/2/. Ein Pfadkonverter aus Django Basics erfasst diese Zahl und übergibt sie an die View. Eine Seite mit den Büchern eines Jahres:

path("years/<int:year>/", views.books_of_year, name="books_of_year"),

def books_of_year(request, year):
    books = Book.objects.filter(year=year)
    return render(request, "books/year.html", {"year": year, "books": books})

Eine Seite für einen Datensatz benennt ihn anhand seines Primärschlüssels, pk: seiner id. get() löst bei einem fehlenden Datensatz eine Ausnahme aus, und eine Ausnahme in einer View führt zu einem Absturz, 500 Serverfehler. get_object_or_404() aus django.shortcuts antwortet stattdessen mit 404 Seite nicht gefunden. Die Funktion erhält zuerst das Modell und dann die Bedingungen: get_object_or_404(Book, title="Emma").

Um auf eine Route zu verlinken, die einen Wert erfasst, setze den Wert nach dem Namen: {% url 'books:books_of_year' book.year %}.

challenge icon

Aufgabe

Mittel

Gib jedem Buch eine Seite. Die Vorlage books/book_detail.html ist bereit und erwartet book.

  1. Schreibe in books/views.py book_detail(request, pk): Die Funktion zeigt das Buch mit dieser ID an oder antwortet mit 404.
  2. Leite in books/urls.py /books/<id>/ (nur Zahlen) dorthin weiter und nenne die Route book_detail.
  3. Verlinke in home.html jeden Titel mit seiner Seite. Nur der Titel ist der Link: <a ...>Dune</a> (1965).

Klicke auf der Startseite auf Dune und öffne dann /books/999/: Seite nicht gefunden (404).

Probier es selbst

from django.shortcuts import render

from .models import Book


def home(request):
    books = Book.objects.all()
    return render(request, "books/home.html", {"books": books})

Alle Lektionen in Modelle und Admin-Bereich

Übe selbstständig: Django-Playground