概要
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 'アプリケーション名:パス名' %}を指定