導入
/search?q=python&page=2 のように、URL の末尾に ?キー=値 を付けて情報を渡すことがあります。これをクエリ文字列と呼び、ビューでは request.GET から読み取ります。
説明
ビューの第1引数 request は、リクエストの情報が詰まった HttpRequest オブジェクトです。よく使うのは次のあたりです。
request.method…"GET"や"POST"などの HTTP メソッドrequest.GET… クエリ文字列(?q=...)を辞書のように読むrequest.path… リクエストされたパス(/search/など)
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
def search(request):
# ?q=... が無ければ "" を既定値にする
q = request.GET.get("q", "")
page = request.GET.get("page", "1")
return HttpResponse(f"method={request.method} 検索語={q} ページ={page}")
urlpatterns = [
path("search/", search),
]
from django.test import Client
client = Client()
print(client.get("/search/?q=python&page=2").content.decode())
print(client.get("/search/").content.decode()) # クエリ無し
request.GET.get("q", "") は「q があればその値、無ければ ""」という意味です。request.GET["q"] でも取れますが、キーが無いとエラーになるため、.get(キー, 既定値) を使うのが安全です。
やってみよう
client.get("/search/?q=django") のように q の値を変えて実行し、出力の「検索語」が変わることを確かめましょう。page を省略すると既定値の 1 になります。
演習
/hello/ にアクセスしたとき、?name=... があればその名前で「こんにちは、○○さん」、無ければ「こんにちは、ゲストさん」と返すビュー hello を作ってください。print(client.get("/hello/?name=Aki").content.decode()) で確認します。
ヒント1を見る
name = request.GET.get("name", "ゲスト")。
ヒント2を見る
return HttpResponse(f"こんにちは、{name}さん")。