本文へスキップ
BecomeCoder

Djangoコース · 第2章 URLとビュー · レッスン6

動的なURL ― パスパラメータ

ブラウザで完結

導入

ブログ記事が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) を登録します。

実際に動かしてみよう

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

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

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