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 aus einem Jahr:
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 einzelnen Datensatz benennt ihn über seinen Primärschlüssel pk: seine id. get() löst bei einem fehlenden Datensatz eine Ausnahme aus, und eine Ausnahme in einer View führt zu einem Absturz: 500 Server Error. get_object_or_404() aus django.shortcuts gibt stattdessen 404 Page not found zurück. 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, gib den Wert nach dem Namen an: {% url 'books:books_of_year' book.year %}.
Aufgabe
MittelGib jedem Buch eine eigene Seite. Die Vorlage books/book_detail.html ist bereit und erwartet book.
- Eine Ansicht
book_detail(request, pk). Eine ID ohne zugehöriges Buch führt zu 404. - Eine Route für
/books/<id>/mit dem Namenbook_detail, die nur Zahlen akzeptiert. - Auf der Startseite führt jeder Titel zu seiner Seite.
Klicke auf „Run“, klicke auf einen Titel und öffne dann /books/999/.
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