Django: URLの逆引き方法

2010/03/21

Djangoでは、ビュー関数名やビューに付けた名前(=名前付きURLパターン)から対応するURLを逆引きする機能をサポートしています。

これを URLの逆引き と呼びますが、この機能を使うとHTML上でURLを直接記述する必要がなくなり、アプリケーションの可搬性が高まります。つまり、通常URL設計を変更する場合、テンプレートやビュー内で変更対象となる部分を書き換える必要が出てきますが、このような書き換え作業から開放されるのです。

それでは、URLの逆引き方法を見てみましょう。

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

  1. ビュー関数名を利用して、対応するURLを逆引きする方法
  2. URLパターンに名前をつけて、この名前を使って対応するURLを逆引きする方法

今、以下のような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 … %} を使う、と覚えましょう。

blog comments powered by Disqus
カテゴリー