導入
ブログ記事が1000本あっても、ビューを1000個は書きません。/articles/1/、/articles/2/…… のように「URL の一部を変数として受け取る」のがパスパラメータです。
説明
path("articles/<int:id>/", ...) の <int:id> が動く部分です。URL の該当箇所が整数のとき一致し、その値が id という名前でビューに渡されます。
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
# 記事のダミーデータ(本来はデータベースから取る)
articles = {1: "Django入門", 2: "テンプレート超入門", 3: "モデルの基礎"}
def article_detail(request, id):
title = articles.get(id, "(存在しない記事)")
return HttpResponse(f"記事{id}: {title}")
def greet(request, name):
return HttpResponse(f"こんにちは、{name}さん!")
urlpatterns = [
path("articles/<int:id>/", article_detail), # <int:id> … 整数
path("hello/<str:name>/", greet), # <str:name> … 文字列
]
from django.test import Client
client = Client()
print(client.get("/articles/1/").content.decode()) # 記事1: Django入門
print(client.get("/articles/99/").content.decode()) # 記事99:(存在しない記事)
print(client.get("/hello/Aki/").content.decode()) # こんにちは、Akiさん!
<int:id>… 整数のみに一致。ビューにはintとして渡ります。<str:name>… スラッシュ以外の文字列に一致。他に<slug:...>(URL向けの文字列)、<uuid:...>などがあります。- ビューの引数名(
id/name)は、URL の<...>の名前と揃えます。
やってみよう
client.get("/articles/2/") や /hello/太郎/ を試して、URL の一部がそのままビューに届くことを確かめましょう。<int:id> の URL に /articles/abc/ のような文字を渡すと一致せず 404 になります(型が違うため)。
演習
/square/<int:n>/ にアクセスすると「n の2乗」を返すビュー square を作ってください。例:/square/5/ なら 25 を返します。最後に print(client.get("/square/5/").content.decode()) で確認します。
ヒント1を見る
def square(request, n): return HttpResponse(str(n * n))。数値は str(...) で文字列にして返します。
ヒント2を見る
path("square/<int:n>/", square) を登録します。