日記

日々のことと、Python/Django/PHP/Laravel/nodejs などソフトウェア開発のことを書き綴ります

reverseを使って関数のURLを取得する

views.pyでURLの逆引き

リダイレクトの使い方などを紹介しましたが、直接URLを指定しても良いのですが、urls.pyの設定が変わった時に views.py も書き換えなければいけないのは正直しんどいと思います。
Djangoにはそういった悩みを解決するため、関数名からURLを逆引きする関数が用意されています。

from django.core.urlresolvers import reverse

def first(request):
    return HttpRequestRedirect(reverse('app1.views.first'))

使い方はこんな感じ。関数が引数を取り、それを urls.py に指定している時には引数が足りないとエラーも出ます。ちなみにパラメータを設定したいときには

from django.core.urlresolvers import reverse

def first(request):
    return HttpRequestRedirect(reverse('app1.views.first', args=['param1', 'param2']))

こんな感じです。

テンプレートでURLを逆引き

リダイレクトするURLは、考えてみればテンプレートの中でもリンクのURLとして利用すると思います。
reverse関数に似た機能が、テンプレートでも利用できるようにビルトインタグが用意されています。

<a href="{% url app1.views.first %}">first function</a>

こんな感じで使います。これを実行すると urls.py の設定に基づいてURLがレンダリングされます。
reverse関数と同じで、パラメータも指定できます。

<a href="{% url app1.views.first param1,param2 %}">first function</a>

こうなります。複数パラメータの場合はカンマ区切りで渡します。

まとめ

reverse関数や、urlタグを利用することで、urls.pyの変更を view や template で気にする必要が軽減されるので非常に便利。
でも、query strings を設定するときは、自分で設定を追加する必要もあるので、注意が必要です。


次回は、Middlewareによる拡張をしてみたいと思います。