Menu
CoddyTech

本ごとのページ

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 %}。

challenge icon

チャレンジ

中級

すべての本にページを用意しましょう。テンプレート books/book_detail.html は準備できており、book を受け取る想定です。

  1. books/views.py に book_detail(request, pk) を書きます。その id の本を表示するか、404 を返します。
  2. books/urls.py で、数字のみの /books/<id>/ を book_detail にルーティングします。
  3. 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プレイグラウンド