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による拡張をしてみたいと思います。