Djangoのテンプレートにおいてaタグのurlを指定する方法:実は3パターンで網羅できる

2021年12月31日Djangoの豆知識urls

はじめに

DjangoのテンプレートHTMLにaタグのhrefでリンク先を指定することはよくあります。

ハードコーディングせず、

<a href="{% url 'blog:detail' blog.id %}">

のように動的に生成する方法をまとめると実は以下の2パターンだけで、簡単だったのでメモしておきます。

1:URLにパラメータがない場合、2:URLにパラメータが1つある場合、3:URLにパラメータが複数ある場合

(1の「URLにパラメータがない場合」とは、例えば、https://example.com/blogのようなもので、2の「URLにパラメータがある場合」とはhttps://example.com/blog/123のようなものです。3はhttps://example.com/blog/123/1221/12のようなものです。)

参考:Django公式のチュートリアル03 URL名の名前空間

バージョン

Django == 3.2

パターン1:URLにパラメータがない場合

URLにパラメータがない場合は以下のようになります

<a href="{% url 'アプリ名:URL名' %}">

例えばブログアプリで、urls.pyが↓の場合

from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('',views.top_func, name='top'),
]

app_nameのblogと、urlのnameであるtopを使って

<a href="{% url 'blog:top' %}">

のようになります。

パターン2:URLにパラメータが1つある場合

URLにパラメータが1つだけある場合は以下のようになります。

<a href="{% url 'アプリ名:URL名' パラメータ %}">

例えばブログアプリでhttps://example.com/blog/12のようなページのURLを指定するときは、urls.pyが↓の場合

from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('<int:id>',views.detail_func, name='detail'),
]

app_nameのblogと、urlのnameであるdetail、パスパラメータの12を使って、

<a href="{% url 'blog:detail' 12 %}">

のようになります。

パターン3:URLにパラメータが複数ある場合

URLにパラメータが複数ある場合は以下のようになります。パターン2のパラメータ部分をスペースで区切って並べただけですね。

<a href="{% url 'アプリ名:URL名' パラメータ1 パラメータ2 %}">

例えばブログアプリでhttps://example.com/blog/baby/12で、urls.pyが↓の場合

from django.urls import path
from . import views

app_name = 'blog'

urlpatterns = [
    path('<str:username>/<int:id>',views.detail_func, name='detail'),
]

app_nameのblog、urlのnameであるdetail、1つ目のパラメータであるbaby、2つ目のパラメータである12を使って

<a href="{% url 'blog:top' baby 12 %}">

のようになります。

まとめ

Djangoのテンプレートにおいてaタグのurlを指定するには3パターンだけ把握すれば十分とわかりました!