web-dev-qa-db-ja.com

Djangoを使用して現在のURL名を取得する方法は?

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

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

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

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

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

81
e-satis

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

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

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

編集:新しい適用Django UPDATE

現在のDjango=アップデートの後に:

Django 1.10link

Django.core.urlresolversモジュールからのインポートは廃止され、新しい場所Django.urlsが採用されました

Django 2.0link

Django.core.urlresolversモジュールは削除され、新しい場所Django.urlsが採用されました。

したがって、正しい方法は次のとおりです。

from Django.urls import resolve
current_url = resolve(request.path_info).url_name
112
Lukas Bünger

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

    current_url = request.resolver_match.url_name

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

101
Bharathwaaj

URLパターンの名前空間を作成する人にとっては、名前空間のリクエストのURL名に興味があるかもしれません。この場合、Djangoはview_name代わりに。

request.resolver_match.view_name

# return: <namespace>:<url name>
20
Yeo

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

request.resolver_match.url_name

Django> 1.8

10
niespodd

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

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

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

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

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

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

あなたのクラスの場合、ビューまたはテンプレートでパターン名をハードコーディングするだけです。これは受け入れられる方法だと思います。

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

3
Conley Owens
1
gruszczy

あなたの質問からは少し不明瞭ですが、 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によって返される形式のPythonリストでなければなりません。 defaults.patterns()。
  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モジュールの使用方法を示しており、正しい方向に導くのに役立つことを願っています。

0
Mark Mayo