98

現在のURLに従って動的にURLを作成する必要があります。タグを使用するの{% url %}が最も簡単な方法ですが、新しいURLを動的に生成するには、現在のURL名が必要です。

現在のビューにつながるurlconfに添付されたURL名を取得するにはどうすればよいですか?

編集:私は手動でURLを使用して手作りできることを知っていますget_absolute_urlが、それは講義の一部であり、URLを作成する1つの方法のみを示したいので、むしろ避けたいと思います。

学生は使い方を知っています{% url %}。彼らは、現在のURLに基​​づいてより完全なURLを生成する必要があるときに、問題に直面していることを知っています。最も簡単な方法は{% url %}、いくつかのバリエーションを付けて、再度使用することです。urlに名前を付けたので、現在のビューを呼び出したurlの名前を取得する方法を知る必要があります。

編集2:別のユースケースは、ベーステンプレートに従ってベーステンプレートの一部を異なる方法で表示することです。他の方法もあります(CSSと{%block%}を使用しますが、ビュー名がリンクと一致する場合は、base.htmlのメニューエントリのタグを削除できると便利な場合があります。

4

8 に答える 8

147

この機能がDjangoの一部であった期間はわかりませんが、次の記事が示すように、ビューでは次のように実現できます。

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

すべてのテンプレートでそれが必要な場合は、テンプレートリクエストを作成するのが適切な場合があります。

編集:新しいDJANGOアップデートの適用

現在のDjangoアップデートに続いて:

Django 1.10リンク

モジュールからのインポートdjango.core.urlresolversは廃止され、新しい場所が優先されます。django.urls

Django 2.0リンク

django.core.urlresolversモジュールは削除され、新しい場所になりますdjango.urls

したがって、正しい方法は次のようになります。

from django.urls import resolve
current_url = resolve(request.path_info).url_name
于 2012-01-10T11:13:19.680 に答える
124

Django 1.5以降、これはリクエストオブジェクトからアクセスできます

current_url = request.resolver_match.url_name

名前空間と一緒にURL名が必要な場合

current_url = request.resolver_match.view_name

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.resolver_match

于 2013-07-12T11:37:14.803 に答える
32

URLパターンに名前空間を付ける場合は、リクエストの名前空間付きURL名に興味があるかもしれません。この場合、Djangoはview_name代わりにそれを呼び出しました。

request.resolver_match.view_name

# return: <namespace>:<url name>
于 2016-07-01T19:42:07.893 に答える
19

これは、次の方法で実現できます。

    request.resolver_match.url_name

Django> 1.8

于 2015-08-11T01:35:56.207 に答える
4

質問の明確化:「ビューで、そのようなurlpatternが1つだけあると仮定して、それを指すurlpatternの名前をどのように取得しますか?」

これは、次の理由で望ましい場合があります。ビュー内から、同じビューへのURLを取得するDRYの方法が必要です(独自のURLパターン名を知る必要はありません)。

簡単な答え:クラスを教えるのはそれほど単純ではありませんが、1〜2時間でGitHubに投げかけるのは楽しいことかもしれません。

本当にこれを実行したい場合は、RegexURLResolverをサブクラス化し、resolveメソッドを変更して、ビューとキーワード/値のペアではなく、一致したパターン(パターン名を取得できる)を返す必要があります。 http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142

次に、このサブクラスを使用してパターン名を取得し、ビューが使用できるようにその値をリクエストのどこかに格納するデコレータまたはより適切なミドルウェアを作成できます。

あなたが実際にそれをしたいと思っていて、あなたがいくつかの問題に遭遇したならば、私に知らせてください、そして私はおそらく助けることができます。

あなたのクラスでは、ビューまたはテンプレートにパターン名をハードコードするだけです。私はこれがそれを行うための許容できる方法であると信じています。

更新: これについて考えれば考えるほど、ビューでurlpattern名を取得しようとするのを思いとどまらせるでしょう。urlpatternパラメーターは、それらが指すビューのパラメーターからかなり独立しています。特定のURLをポイントする場合は、ビューがどのように機能するかだけでなく、urlpatternがどのように機能するかを知る必要があります。urlpatternがどのように機能するかを知る必要がある場合は、urlpatternの名前も知っておく必要があります。

于 2010-04-04T23:10:35.167 に答える
3

試してみてくださいrequest.path。これにより、要求されている現在のパスが取得されます。

于 2020-04-04T07:57:40.427 に答える
2

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path

于 2010-03-22T11:15:04.500 に答える
1

あなたの質問からは少し不明確ですが、http://docs.djangoproject.com/en/dev/topics/http/urls/はおそらくあなたが何を求めているのかを説明するでしょう。

Djangoがリクエストを処理する方法に注意するのに特に役立ちます。

ユーザーがDjangoを利用したサイトからページをリクエストすると、これはシステムが実行するPythonコードを決定するために従うアルゴリズムです。

  1. Djangoは、使用するルートURLconfモジュールを決定します。通常、これはROOT_URLCONF設定の値ですが、着信HttpRequestオブジェクトにurlconf(ミドルウェア要求処理によって設定される)という属性がある場合、その値がROOT_URLCONF設定の代わりに使用されます。
  2. DjangoはそのPythonモジュールをロードし、変数urlpatternsを探します。これは、関数django.conf.urls.defaults.patterns()によって返される形式のPythonリストである必要があります。
  3. Djangoは各URLパターンを順番に実行し、要求されたURLに一致する最初のパターンで停止します。
  4. 正規表現の1つが一致すると、Djangoは指定されたビューをインポートして呼び出します。これは単純なPython関数です。ビューには、最初の引数としてHttpRequestが渡され、残りの引数として正規表現にキャプチャされた値が渡されます。

フルパスの直後にいる場合は、次のことを試すことができます。

http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path

これがお役に立てば幸いです。URLconfモジュールの使用方法を示しており、正しい方向を示すのに役立つことを願っています。

于 2010-03-22T11:17:05.230 に答える