導入
まずは一番シンプルな検索フォームから。HTML の <form> で入力欄を出し、送信された内容をビューで受け取る流れをつかみます。
説明
<form method="get"> で送信すると、入力値が URL の ?キー=値 として送られ、ビューの request.GET で読めます(第2章で学んだ通りです)。ここでは「フォームの HTML を返す」ところと「送信を受け取る」ところを1つのビューで扱います。
import django
from django.conf import settings
if not settings.configured:
settings.configure(DEBUG=True, SECRET_KEY="dev",
ROOT_URLCONF=__name__, ALLOWED_HOSTS=["testserver"])
django.setup()
from django.http import HttpResponse
from django.urls import path
# 果物リスト(本来はデータベース)
FRUITS = ["りんご", "みかん", "ぶどう", "もも", "みかんゼリー"]
def search(request):
q = request.GET.get("q", "")
# 入力があれば、名前に q を含む果物だけに絞る
hits = [f for f in FRUITS if q in f] if q else FRUITS
form_html = (
'<form method="get">'
'<input name="q" value="' + q + '">'
'<button>検索</button>'
'</form>'
)
return HttpResponse(form_html + "結果: " + " / ".join(hits))
urlpatterns = [path("", search)]
from django.test import Client
client = Client()
print(client.get("/").content.decode()) # 全件(qが空)
print(client.get("/?q=みかん").content.decode()) # 「みかん」を含むものだけ
<form method="get">で送信すると、<input name="q">の値が?q=...になります。- ビューは
request.GET.get("q", "")で受け取り、それを使って結果を絞り込みます。 - 検索のように「状態を変えない」入力は GET が向いています。一方、投稿やログインのような「状態を変える」入力は POST を使います(次のレッスン)。
やってみよう
client.get("/?q=もも") や /?q=ぶどう を試して、絞り込み結果が変わることを確かめましょう。q を空にすると全件が返ります。
演習
?q= の代わりに ?min= を受け取り、「文字数が min 以上の果物」だけを返すように search を書き換えてください。例:/?min=4 なら4文字以上の果物だけ。print(client.get("/?min=4").content.decode()) で確認します。
ヒント1を見る
m = int(request.GET.get("min", "0")) で数値にします(GET の値は文字列なので int(...))。
ヒント2を見る
hits = [f for f in FRUITS if len(f) >= m]。