DjangoアプリのURLリンクの貼り方とメリット

Djangoではurlリンクを貼るときに urlのテンプレートタグ というのを使います。

こんなの↓

{%!u(MISSING)rl リンク名 %!}(MISSING)

このurlテンプレートタグの使い方とメリットをメモします。

urlテンプレートタグの使い方

使い方はこう↓

<a href="{%!u(MISSING)rl 'index' %!}(MISSING)">Home</a>

こうすることで、urls.pyに指定した下記のようなパス名のURLが書き出されます。

urlpatterns = [
    path('', views.index, name='index'), # nameがindexとなっているパスが呼ばれる
]

HTMLに慣れたあなたは「なんでこんなことするの?絶対パスにすれば楽なのに。。。」と言う。

私もそう思いました。リンクを貼るだけならHTML記法だけで十分だし、そのほうが楽チンですからね。

urlテンプレートタグを使うメリット

PythonやDjangoの機能と絡めて動的に扱えるのが利点です。

例えばurls.pyで次のような news-year-archive という名前のパスがあるとします。

urlpatterns = [
    # <int:year>でint型の数値を受け取れる
    path('articles/<int:year>/', views.year_archive, name='news-year-archive'),
    #...
]

articles/<int:year> のyearはint型の数字を引数にとってくれます。1999でもいいし、2018でも大丈夫です。同じ形式のリンクを大量に作りたいときなどに便利です。

# テンプレート側に書くリンク。
# urls.py側に"2012"を渡すようにしている。
<a class="navbar-item" href="{%!u(MISSING)rl 'news-year-archive' 2012 %!}(MISSING)">2012 Archive</a>

views.pyでは次のようにyearを引数として受け取れるようにします。さらに引数として受け取った変数をテンプレートへ渡すこともできちゃったり。

def year_archive(request, year):
    params = {
        'title': '年月アーカイブ',
        'subtitle': '',
        'year': year,
    }
    return render(request, 'hello/year_archive.html', params)

まとめ

Djangoのurlテンプレートタグの基本的な使い方をまとめました。他にも色々機能があるようですが、必要になったら調べることにして、取り急ぎここまで。