本ごとのページ
CoddyのDjangoジャーニー「モデルと管理サイト」セクションの一部。レッスン 14/23。
各書籍には、/books/1/、/books/2/のように、それぞれ固有のアドレスにページが必要です。Django Basicsで学んだパスコンバーターがその数字を取得し、ビューに渡します。ある年の書籍一覧ページは次のとおりです。
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})1行分のページでは、主キーであるpk、つまりidでその行を指定します。存在しない行に対してget()を呼び出すと例外が発生し、ビュー内の例外はクラッシュ、つまり500 Server Errorになります。django.shortcutsのget_object_or_404()を使うと、代わりに404 Page not foundを返します。モデルを指定し、その後に条件を指定します。例:get_object_or_404(Book, title="Emma")。
値を受け取るルートへのリンクを作成するには、名前の後に値を指定します。{% url 'books:books_of_year' book.year %}。
チャレンジ
中級それぞれの本にページを用意しましょう。テンプレート books/book_detail.html は準備済みで、book を受け取る想定です。
- ビュー
book_detail(request, pk)。本が存在しない ID へのアクセスには 404 を返します。 /books/<id>/用のルートをbook_detailという名前で作成し、数字のみに一致させます。- ホームページでは、各タイトルからその本のページへリンクします。
Run を押し、タイトルをクリックしてから、/books/999/ を開いてください。
自分で試してみよう
from django.shortcuts import render
from .models import Book
def home(request):
books = Book.objects.all()
return render(request, "books/home.html", {"books": books})
モデルと管理サイトのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド