Django のコードを時々読むと、いくつかのテンプレートが表示されreverse()
ます。これが何であるかはよくわかりませんが、HttpResponseRedirect と一緒に使用されます。これはいつ、どのようreverse()
に使用されるべきですか?
7 に答える
urls.py
あなたがこれを定義したとしましょう:
url(r'^foo$', some_view, name='url_name'),
テンプレートでは、この URL を次のように参照できます。
<!-- django <= 1.4 -->
<a href="{% url url_name %}">link which calls some_view</a>
<!-- django >= 1.5 or with {% load url from future %} in your template -->
<a href="{% url 'url_name' %}">link which calls some_view</a>
これは次のようにレンダリングされます。
<a href="/foo/">link which calls some_view</a>
たとえば、他のビュー ( ではviews.py
ない ) で他の URL ( ではない ) を処理していて、ユーザーをリダイレクトしたい(多くの場合、フォーム送信が成功した場合)。/foo/
some_view
/foo/
あなたはただ行うことができます:
return HttpResponseRedirect('/foo/')
しかし、将来 URL を変更したい場合はどうすればよいでしょうか。コード内のすべての参照を更新する必要がurls.py
あります。これは、 DRY (Don't Repeat Yourself)の原則と、1 か所だけで編集するという考え全体に違反しています。これは努力すべきことです。
代わりに、次のように言えます。
from django.urls import reverse
return HttpResponseRedirect(reverse('url_name'))
これは、プロジェクトで定義されたすべての URL を調べて、名前で定義された URL を探しurl_name
、実際の URL を返します/foo/
。
これは、name
属性によってのみ URL を参照することを意味します。URL 自体または URL が参照するビューを変更したい場合は、1 か所だけを編集するだけで変更できますurls.py
。
既存の答えは非常に明確です。呼び出される理由がわからない場合に備えてreverse
: URL 名を入力すると、実際の URL が返されます。これは、最初に URL を指定してから名前を付けるのとは逆です。
この関数はドライ原則をサポートしており、アプリ全体で URL をハードコーディングしないようにしています。URL は 1 か所で定義する必要があります。URL conf は 1 か所だけです。その後、あなたは本当にその情報を参照しているだけです。
reverse()
ビューへのパス、または URL conf の page_name パラメータのいずれかを指定して、ページの URL を取得するために使用します。を使用してテンプレートでそれを行う意味がない場合に使用し{% url 'my-page' %}
ます。
この機能を使用できる場所はたくさんあります。ビューでユーザーをリダイレクトするとき(多くの場合、フォームの処理が成功した後)に使用することがわかりました-
return HttpResponseRedirect(reverse('thanks-we-got-your-form-page'))
テンプレートタグを記述するときにも使用できます。
私が使用した別の時間reverse()
は、モデルの継承でした。親モデルに ListView がありましたが、それらの親オブジェクトのいずれかから、関連付けられている子オブジェクトの DetailView に取得したいと考えていました。get__child_url()
子の存在を識別し、 を使用してその DetailView の URL を返す関数を親に添付しましたreverse()
。
そのためのドキュメントがあります
https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
特定のビューの URL を生成するために使用できます。
主な利点は、コードにルートをハードコーディングしないことです。
これreverse()
は、django DRY の原則に従うために使用されます。つまり、後で URL を変更する場合は、reverse(urlname) を使用してその URL を参照できます。