Djangoでは、ビュー関数名やビューに付けた名前(=名前付きURLパターン)から対応するURLを逆引きする機能をサポートしています。
これを URLの逆引き と呼びますが、この機能を使うとHTML上でURLを直接記述する必要がなくなり、アプリケーションの可搬性が高まります。つまり、通常URL設計を変更する場合、テンプレートやビュー内で変更対象となる部分を書き換える必要が出てきますが、このような書き換え作業から開放されるのです。
それでは、URLの逆引き方法を見てみましょう。
逆引きの方法は大きく2通りあります。
両方とも、ビュー関数とテンプレートファイル内から利用することができます。
今、以下のようなurls.pyの記述があったとしましょう。
urlpatterns = patterns('',
# 名前なしパターン
(r'^posts_a/(?P<post_id>\d+)/$', 'posts.views.detail_a'),
# 名前付きパターン
url(r'^posts_b/(?P<post_id>\d+)/$', 'posts.views.detail_b',
name='posts-detail'),
...
)
「/posts_a/...」が名前なしURLパターン、「/posts_b/...」が名前付きURLパターンで *name='posts-detail’* の部分がURLパターンに対する名前になります。名前付きパターンは、 url() 関数を用いてURLパターンを定義することに注意してください。
上記detail_a()、detail_b()に対応したURLをこれらビュー関数から求める方法は、 「reverse()」 を使うことによって実現されます。
from django.core.urlresolvers import reverse
...
v['urlpath_a'] = reverse("posts.views.detail_a")
v['urlpath_b'] = reverse("posts-detail")
...
また、テンプレートファイルから逆引きする方法は、 「{% url … %}」 テンプレート関数を使うことによって、実現されます。
...
<a href="{% url "posts.views.detail_a" %}"> url of detail_a </a>
<a href="{% url "posts-detail" %}"> url of detail_b </a>
...
ビュー関数からは、 reverse() , テンプレートファイルからは {% url … %} を使う、と覚えましょう。