Django:urls.py(URLconf)の設定内容からURLを得る
実装パターン
Pythonコード
from django.urls import reverse
reverse('namaspace:name', args=(引数1, 引数2, ...))
# または
reverse('namaspace:name', kwargs={key1: value1, key2: value2, ...})
※argsはtupleにして指定する必要がある
テンプレート
{% url 'namaspace:name' 引数1 引数2 ... %}
<!-- または -->
{% url 'namaspace:name' key1=value1 key2=value2 ... %}
実装例
Django 2.2.9 で動作を確認
mysite/mysite/urls.py
from django.urls import include, path
urlpatterns = [
path('myapp/', include('mysite.myapp.urls')),
]
mysite/myapp/urls.py
from django.urls import path, re_path
from . import views
app_name = 'my_app'
urlpatterns = [
# 必須の引数あり
path(
'view1/<int:id1>/<int:id2>/',
views.MyView1.as_view(),
name='my_view1'
),
# 任意の引数あり
re_path(
'view2/((?P<id>[^/]+)/)?',
views.MyView2.as_view(),
name='my_view2'
),
]
mysite/myapp/views.py
from django.urls import reverse
# 必須の引数あり
reverse('my_app:my_view1', args=(123, 456,))
# → /myapp/view1/123/456/
reverse('my_app:my_view1', kwargs={'id1': 123, 'id2': 456,})
# → /myapp/view1/123/456/
# 任意の引数あり
reverse('my_app:my_view2', args=(123,))
# → /myapp/view2/123
reverse('my_app:my_view2', kwargs={'id': 123})
# → django.urls.exceptions.NoReverseMatch: Reverse for 'my_view2' with keyword arguments '{'id': '123'}' not found. 1 pattern(s) tried: ['myapp\\/view2/((?P<id>[^/]+)/)?']
mysite/myapp/templates/myapp/sample.html
<!-- 必須の引数あり -->
{% url 'my_app:my_view1' 123 456 %}
<!-- → /myapp/view1/123/456/ -->
{% url 'my_app:my_view1' id1=123 id2=456 %}
<!-- → /myapp/view1/123/456/ -->
<!-- 任意の引数あり -->
{% url 'my_app:my_view2' 123 %}
<!-- → /myapp/view2/123 -->
{% url 'my_app:my_view2' id=123 %}
<!-- → django.urls.exceptions.NoReverseMatch: Reverse for 'my_view2' with keyword arguments '{'id': 123}' not found. 1 pattern(s) tried: ['myapp\\/view2/((?P<id>[^/]+)/)?'] -->
実装時の注意点
任意の引数があるURLの場合
- 引数名指定では設定出来ない
- URL取得時に末尾の「/」が欠ける