Djangoを使用して現在のURL名を取得するにはどうすればよいですか?
-
21-09-2019 - |
質問
現在の URL に従って動的に URL を構築する必要があります。の使用 {% url %}
タグを使用するのが最も簡単な方法ですが、新しい URL を動的に生成するには現在の URL 名が必要です。
現在のビューにつながる urlconf に添付されている URL 名を取得するにはどうすればよいですか?
編集 :次を使用して URL を手動で作成できることはわかっています get_absolute_url
しかし、これは講義の一部であり、URL を構築する 1 つの方法のみを説明したいので、これは避けたいと思います。
生徒たちは使い方を知っています {% url %}
. 。彼らは、現在の URL に基づいてより完全な URL を生成する必要があるときに問題に直面していることを知っています。最も簡単な方法は使用することです {% url %}
もう一度、いくつかのバリエーションを加えます。URLに名前を付けたので、 現在のビューを呼び出した URL の名前を取得する方法を知る必要があります。
編集2:別の使用例は、ベース テンプレートに応じてベース テンプレートの一部を別々に表示することです。他の方法 (CSS と {% block %} を使用する) もありますが、ビュー名がリンクと一致する場合に、base.html のメニュー エントリのタグを削除できると便利な場合があります。
解決
この機能がどれくらい前から Django の一部になっているかはわかりませんが、 次の記事 に示すように、ビュー内で次のように実現できます。
from django.core.urlresolvers import resolve
current_url = resolve(request.path_info).url_name
すべてのテンプレートでこれが必要な場合は、テンプレート リクエストを記述することが適切な場合があります。
編集:新しい Django アップデートの適用
現在の Django アップデートに従って:
ジャンゴ 1.10 (リンク)
からのインポート
django.core.urlresolvers
モジュールは新しい場所を支持して非推奨されています、django.urls
ジャンゴ 2.0 (リンク)
の
django.core.urlresolvers
モジュールは、新しい場所を支持して削除されます。django.urls
.
したがって、正しい方法は次のようになります。
from django.urls import resolve
current_url = resolve(request.path_info).url_name
他のヒント
のように、これはリクエストオブジェクト
からアクセスすることができます current_url = request.resolver_match.url_name
https://docs.djangoproject.com/en/ DEV / REF /要求 - 応答/#django.http.HttpRequest.resolver_matchする
そのURLパターンを名前空間人のために、あなたは、要求の名前空間URL名に興味があるかもしれません。この場合、Djangoはそれが代わりにview_name
呼ばれます。
request.resolver_match.view_name
# return: <namespace>:<url name>
このはを介して達成することができるます:
request.resolver_match.url_name
のジャンゴ> 1.8 の
質問の明確化:「ビューでは、そのような URL パターンが 1 つだけ存在すると仮定して、それを指す URL パターンの名前をどのように取得しますか。」
これは、次のような理由から望ましいと考えられます。ビュー内から、同じビューへの URL を取得する DRY な方法が必要です (独自の URL パターン名を知る必要はありません)。
短い答え:クラスで教えるほど簡単ではありませんが、1 ~ 2 時間でやって、GitHub に吐き出すのは楽しいかもしれません。
これを本当に実行したい場合は、RegixURLResolver をサブクラス化し、ビューとキーワード/値のペアではなく、一致したパターン (パターン名を取得できるパターン) を返すように、resolve メソッドを変更する必要があります。http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142
次に、このサブクラスを使用してパターン名を取得し、ビューがその値を使用できるようにその値をリクエスト内のどこかに保存するデコレーター、またはおそらくより適切なミドルウェアを作成できます。
実際にそうしたいのに何か問題が発生した場合は、私に知らせてください。おそらくお手伝いできると思います。
あなたのクラスの場合は、ビューまたはテンプレートにパターン名をハードコードするだけです。これは許容できるやり方だと思います。
アップデート:これについて考えれば考えるほど、ビューで URL パターン名を取得しようとする意欲が失せます。urlpattern パラメータは、それらが指すビューのパラメータからかなり独立しています。特定の URL をポイントしたい場合は、ビューがどのように機能するかだけでなく、url パターンがどのように機能するかを知る必要があります。URL パターンがどのように機能するかを知る必要がある場合は、URL パターンの名前も知っておく必要があるかもしれません。
質問文からは少し分かりにくいですが、 http://docs.djangoproject.com/en/dev/topics/http/urls/ おそらく、あなたが求めているものについての説明が得られるでしょう。
Django がリクエストをどのように処理するかをメモしておくと特に役立ちます。
ユーザーが Django を利用したサイトからページをリクエストすると、システムは次のアルゴリズムに従って、どの Python コードを実行するかを決定します。
- Django は、使用するルート URLconf モジュールを決定します。通常、これは ROOT_URLCONF 設定の値ですが、受信した HttpRequest オブジェクトに urlconf と呼ばれる属性 (ミドルウェア要求処理によって設定) がある場合は、その値が ROOT_URLCONF 設定の代わりに使用されます。
- Django はその Python モジュールをロードし、変数 urlpatterns を探します。これは、関数 django.conf.urls.defaults.patterns() によって返される形式の Python リストである必要があります。
- Django は各 URL パターンを順番に実行し、要求された URL に最初に一致するパターンで停止します。
- 正規表現の 1 つが一致すると、Django は、単純な Python 関数である指定されたビューをインポートして呼び出します。ビューには、最初の引数として HttpRequest が渡され、残りの引数として正規表現でキャプチャされた値が渡されます。
フルパスの直後にいる場合は、次のことを試してみてください。
http://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.get_full_path
これがお役に立てば幸いです。URLconf モジュールの使用方法が示されており、正しい方向への導きに役立つことを願っています。