本ごとのページ
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 サーバーエラーになります。django.shortcuts の get_object_or_404() を使うと、代わりに404 ページが見つかりませんを返します。モデルを指定し、その後に条件を指定します。例:get_object_or_404(Book, title="Emma")。
値を取得するルートへのリンクを作成するには、名前の後に値を指定します。{% url 'books:books_of_year' book.year %}。
チャレンジ
中級すべての本にページを用意しましょう。テンプレート books/book_detail.html は準備できており、book を受け取る想定です。
books/views.pyにbook_detail(request, pk)を書きます。その id の本を表示するか、404 を返します。books/urls.pyで、数字のみの/books/<id>/をbook_detailにルーティングします。home.htmlで、それぞれのタイトルをその本のページにリンクします。リンクにするのはタイトルだけです。<a ...>Dune</a> (1965)。
ホームページで Dune をクリックしてから、/books/999/ を開きます。ページが見つかりません (404)。
自分で試してみよう
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プレイグラウンド