286

Django のコードを時々読むと、いくつかのテンプレートが表示されreverse()ます。これが何であるかはよくわかりませんが、HttpResponseRedirect と一緒に使用されます。これはいつ、どのようreverse()に使用されるべきですか?

4

7 に答える 7

434

reverse()| | Django ドキュメント


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

于 2012-06-28T09:43:24.243 に答える
14

既存の答えは非常に明確です。呼び出される理由がわからない場合に備えてreverse: URL 名を入力すると、実際の URL が返されます。これは、最初に URL を指定してから名前を付けるのとは逆です。

于 2019-10-22T09:40:54.817 に答える
4

この関数はドライ原則をサポートしており、アプリ全体で 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()

于 2016-04-09T02:25:33.413 に答える
3

そのためのドキュメントがあります

https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls

特定のビューの URL を生成するために使用できます。

主な利点は、コードにルートをハードコーディングしないことです。

于 2012-06-28T09:35:00.940 に答える
2

これreverse()は、django DRY の原則に従うために使用されます。つまり、後で URL を変更する場合は、reverse(urlname) を使用してその URL を参照できます。

于 2014-12-02T17:53:09.217 に答える