Django: URLの逆引き方法

2010年3月25日

Djangoでは、ビュー関数名やビューに付けた名前(=名前付きURLパターン)から対応するURLを逆引きする機能をサポートしています。 これを URLの逆引き と呼びますが、この機能を使うとHTML上でURLを直接記述する必要がなくなり、アプリケーションの可搬性が高まります。つまり、通常URL設計を変更する場合、テンプレートやビュー内で変更対象となる部分を書き換える必要が出てきますが、このような書き換え作業から開放されるのです。 それでは、URLの逆引き方法を見てみましょう。

逆引きの方法は大きく2通りあります。 両方とも、ビュー関数とテンプレートファイル内から利用することができます。  

  • ビュー関数名を利用して、対応するURLを逆引きする方法 
  • URLパターンに名前をつけて、この名前を使って対応するURLを逆引きする方法  
今、以下のようなurls.pyの記述があったとしましょう。

1
2
3
4
5
6
urlpatterns = patterns('', 
                           # 名前なしパターン 
                           (r'^posts_a/(?P\d+)/$', 'posts.views.detail_a'), 
                           # 名前付きパターン 
                           url(r'^posts_b/(?P\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() を使うことによって実現されます。 

1
2
3
from django.core.urlresolvers import reverse
v['urlpath_a'] = reverse("posts.views.detail_a") 
v['urlpath_b'] = reverse("posts-detail")

また、テンプレートファイルから逆引きする方法は、 {% url ... %} テンプレート関数を使うことによって、実現されます。 

ビュー関数からは、 reverse() , テンプレートファイルからは {% url ... %}を使う、と覚えましょう。