あるフリーランスエンジニアの色んなメモ!! ITスキル・ライフハックとか

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取得時に末尾の「/」が欠ける
comments powered by Disqus