概要
urls.py
でURLパターンからビューへのルーティングを指定しただけの場合、テンプレートでそのルーティングを使うにはURLを直書きしなければならない。
これに対して、urls.py
のURLパターンを任意に変更しても影響が及ばないようにするには、DTLのurl
タグを使う。
URLハードコーティングの場合
たとえばmyapp
アプリケーションのmain
ページからsub
ページへのリンクを貼りたいとする。
アプリケーションのurls.py
は以下のようになっているとする。
1 2 3 4 5 6 7 |
from django.urls import path from myapp import views urlpatterns = [ path('', views.main), path('sub', views.sub), ] |
ルーティングされたビュー関数が以下のように書かれているとする。
1 2 3 4 5 6 7 |
from django.shortcuts import render def main(request): return render(request, 'myapp/main.html') def sub(request): return render(request, 'myapp/sub.html') |
レンダリングされるテンプレートでURLをハードコーティングした場合は以下のようになる。
main.html
1 2 3 |
<h1>メインページ</h1> <a href="/myapp/sub">サブページへ</a> |
sub.html
1 |
<h1>サブページ</h1> |
このときのURL指定と各ページの対応は以下のとおり。
[DOMAIN]/myapp/
→views.main
→main.html
[DOMAIN]/myapp/sub
→views.sub
→sub.html
URLハードコーティングの問題
urls.py中のpath
関数のURLのパターンを任意に変化させると、各テンプレート中のURLを全て見直さなければならない。これの影響を及ぼさせないようにしたい。
urls.pyでのname指定
urls.py
中、抽象化したいpath
関数にname
引数を追加する。この場合はsub
ページへのpath
関数を以下のように変更。
1 2 3 4 5 6 7 |
from django.urls import path from myapp import views urlpatterns = [ path('', views.main), path('sub', views.sub, name='sub'), ] |
そして、sub
ページへのURLの代わりにDTLのurl
タグを使い、その引数にurls.py
のname
で指定した値を与える。
1 2 3 |
<h1>メインページ</h1> <a href="{% url 'sub' %}">サブページへ</a> |
アプリケーションを指定する場合
異なるアプリケーションでname
に指定したい値が重複する場合、[app_name]:[path_name]
で指定できるようにする。
path()
関数でname
を指定する際、urls.py
の冒頭でapp_name
変数にアプリケーション名の文字列を指定しておく。
1 2 3 4 5 6 7 8 9 |
from django.urls import path from myapp import views app_name = 'myapp' urlpatterns = [ path('', views.main), path('sub', views.sub, name='sub'), ] |
そして、DTLのurl
タグの引数にapp_name
で指定した値を加える。
1 2 3 |
<h1>メインページ</h1> <a href="{% url 'myapp:sub' %}">サブページへ</a> |
まとめ
グローバルなパス名の場合
urls.py
のpath
関数にname
引数でパス名を指定- URLの代わりに
{% url 'パス名' %}
を指定
アプリケーションローカルなパス名の場合
urls.py
のpath
関数にname
引数でパス名を指定urls.py
の冒頭でapp_name='アプリケーション名'
を記述- URLの代わりに
{% url 'アプリケーション名:パス名' %}
を指定