Djangoを使用して現在のURL名を取得するにはどうすればよいですか?


90

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

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

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

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

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


6
私は、出力への道を探しながら、この質問を見つけるのまま、現在、テンプレートタグを経由して絶対URLを:あなたはそれにも探しているなら、それはだ...{{ request.get_full_path }}
ドルフ

回答:


134

この機能が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

どうして?私はあなたの質問を理解してきたこれまでのように、それの重要な部分を達成するためにどのようだった...「我々はURL命名しておりますので、私たちは現在のビューと呼ばれるそのURLの名前を取得する方法を知っておく必要がある。」
ルーカスビュンガー2012年

1
実は私はその日不機嫌で、あなたの答えを完全に恣意的に捨てました。これは実際には正しい答えなので、お詫び申し上げます。私はそれを編集して、よりわかりやすくします。
e-satis 2012年

8
resolve()クエリ文字列を渡して404を上げると、解決できませんget_full_path()。パスとクエリ文字列を返します。を使用する必要がありますresolve(request.path_info)
缶ブラクÇilingir

そうでない場合はどうcurrent解決する必要があるURLが、言う、一人のユーザーがにリダイレクトしようとしていますか?これを達成するためのより一般的な方法は何ですか?Conley Owensの答えには手がかりがありますが、ホイールがDjangoの内部にすでに存在する場合は、ホイールを再発明したくありません。
Hassan Baig 2018

これはi18n_patternsで翻訳可能なURLのために動作するようには思えない
guival

109

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

    current_url = request.resolver_match.url_name

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


これをコンテキストプロセッサに入れると機能しましたが、この奇妙なエラーがコンソールに表示されました:AttributeError: 'WSGIRequest' object has no attribute 'resolver_match'
fjsj 2013

2
'resolver_match'は、すべてのリクエストミドルウェアを呼び出した後にのみリクエストオブジェクトに追加されます。それはURLが解決されているときです。したがって、ビューミドルウェア以降からのみアクセスできます。(ミドルウェアのprocess_view関数)。リクエストミドルウェア機能では使用できません。(ミドルウェアのprocess_request関数)。
Bharathwaaj 2013

.view_name名前空間が必要な場合

27

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

request.resolver_match.view_name

# return: <namespace>:<url name>

ありがとう、でもこれは@ dariusz-niespodzianyの以前の答えとほぼ同じですよね。stackoverflow.com/a/31931833/1450294
Michael Scheper 2017年

5
名前空間を設定しなかった場合urls.py、@ dariusz-niespodzianyはすぐに使用可能になりreverseます。ただし、名前空間を使用している場合resolver_match.url_nameは、直接使用できませんreverse。したがって、名前空間を自分で追加する必要があります。そのため、自分で行う代わりに、Djangoは.view_name初期化時にすでに設定しています。
Yeo 2017年

15

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

    request.resolver_match.url_name

Django> 1.8


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の名前も知っておく必要があります。




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モジュールの使用方法を示しており、正しい方向を示すのに役立つことを願っています。


ありがとう、でも私はそれを知っています:-)誤解を避けるためにいくつかの説明を追加しました。
e-satis 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.