utamaro’s blog

誰かの役に立つ情報を発信するブログ

Djangoのtemplate内でurlの逆引きをする方法

逆引きをやることで、何がいいのか。

やらなくてもできますが、べた書きする必要があります。

例えば、anchorタグのhref属性に/api/hoge/delete/{{id}}と書いたりすることになります。

複数の場所で↑のように書いてた場合は修正が大変になります。

あと、templateがスッキリします。

url.pyに以下のように書かれているとします。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('v1/<int:id1>', TopView1.as_view(), name='top1'),  # pattern1
    path('v2/<int:id1>/<int:id2>', TopView2.as_view(), name='top2'),  # pattern2
    path('v3/<int:id1>_<int:id2>', TopView3.as_view(), name='top3'),  # pattern3
]

pattern1 ~ pattern3に関して、どのように書くか。

viewでは↓のように、kwargsから値(id)を取得できます。

# TopView1, TopView2, TopView3
class TopView(TemplateView):
    template_name = 'top.html'

    def get(self, request, *args, **kwargs):
        context = {
            'id': kwargs['id'],  # id1, id2, 
        }
        return self.render_to_response(context)

pattern1の場合

↑のpathの場合、/v1/1234でGETリクエストが届いた場合、TopViewのgetメソッドが実行されます。

template(htmlファイル)側で、anchorタグをクリックするとv1/1234のページが表示されるのを想定します。

<a href="{% url 'top1' 1234 %}">
    トップページへ
</a>

すると、/v1/1234に変換されます。

pattern2の場合

次に、v2の方の場合の説明です。

v2は/で区切られていて、さらに値を2つ渡す必要があります。

こちらも簡単です。

<a href="{% url 'top2' 1234 6789 %}">
    トップページへ
</a>

すると、/v2/1234/5678に変換されます。

自分で/で区切り必要がないので凄く見やすいです。

pattern3の場合

v3は/で区切られていなくて、2つの値を_で連結しています。

こちらも簡単です。

<a href="{% url 'top2' 1234 6789 %}">
    トップページへ
</a>

すると、/v2/1234_5678に変換されます。

自分で_で連結する必要がないので凄く助かります。