本を検索する
CoddyのDjangoジャーニー「モデルと管理サイト」セクションの一部。レッスン 15/23。
本棚には検索ボックスが必要です。検索ページは、訪問者が入力した内容をアドレスから読み取ります。/search/?q=duneでは、?の後の部分がクエリ文字列で、Djangoはそのペアを辞書のように扱えるrequest.GETに格納します。ヘッダーの検索ボックスは、このアドレスを組み立てるフォームです。フォームについてはFormsのセクションで説明します。1つのジャンルを表示するページでは、次のように読み取れます。
def by_genre(request):
genre = request.GET.get("genre", "fiction")
books = Book.objects.filter(genre=genre)
return render(request, "books/genre.html", {"genre": genre, "books": books}).get("genre", "fiction")は、アドレスにgenreがない場合にデフォルト値を返します。その場合、request.GET["genre"]を使うと例外が発生し、500エラーになります。値は常にテキストです。?page=2は"2"になります。すべてのテキストには空のテキストが含まれるため、__icontains=""はすべての行に一致します。
チャレンジ
簡単検索ページを追加します。テンプレート books/search.html は用意されており、q と books を想定しています。
- アドレスから
qを読み取り(存在しない場合は空文字列)、大文字と小文字を区別せずにタイトルにその文字列を含む本を検索するビューsearch。 search/という名前付きルートsearch。
「Run」を押し、ヘッダーで dune を検索してから、/search/ を開きます。
自分で試してみよう
from django.shortcuts import get_object_or_404, render
from .models import Book
def home(request):
books = Book.objects.all()
return render(request, "books/home.html", {"books": books})
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk)
return render(request, "books/book_detail.html", {"book": book})
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
モデルと管理サイトのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド