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
に変換されます。
自分で_
で連結する必要がないので凄く助かります。