本文へスキップ
BecomeCoder

Djangoコース · 第4章 フォームと入力 · レッスン15

フォームで入力を受け取る ― GET フォーム

ブラウザで完結

導入

まずは一番シンプルな検索フォームから。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]

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。