Django – DTL – URL

概要

urls.pyでURLパターンからビューへのルーティングを指定しただけの場合、テンプレートでそのルーティングを使うにはURLを直書きしなければならない。

これに対して、urls.pyのURLパターンを任意に変更しても影響が及ばないようにするには、DTLのurlタグを使う。

URLハードコーティングの場合

たとえばmyappアプリケーションのmainページからsubページへのリンクを貼りたいとする。

アプリケーションのurls.pyは以下のようになっているとする。

ルーティングされたビュー関数が以下のように書かれているとする。

レンダリングされるテンプレートでURLをハードコーティングした場合は以下のようになる。

main.html

sub.html

このときの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関数を以下のように変更。

そして、subページへのURLの代わりにDTLのurlタグを使い、その引数にurls.pynameで指定した値を与える。

アプリケーションを指定する場合

異なるアプリケーションでnameに指定したい値が重複する場合、[app_name]:[path_name]で指定できるようにする。

path()関数でnameを指定する際、urls.pyの冒頭でapp_name変数にアプリケーション名の文字列を指定しておく。

そして、DTLのurlタグの引数にapp_nameで指定した値を加える。

まとめ

グローバルなパス名の場合

  1. urls.pypath関数にname引数でパス名を指定
  2. URLの代わりに{% url 'パス名' %}を指定

アプリケーションローカルなパス名の場合

  1. urls.pypath関数にname引数でパス名を指定
  2. urls.pyの冒頭でapp_name='アプリケーション名'を記述
  3. URLの代わりに{% url 'アプリケーション名:パス名' %}を指定

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です