現在のURLに従ってURLを動的に作成する必要があります。 {% url %}
タグを使用するのが最も簡単な方法ですが、新しいURLを動的に生成するには現在のURL名が必要です。
現在のビューにつながるurlconfに添付されたurl名を取得するにはどうすればよいですか?
編集:私は手動でget_absolute_url
を使用して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 UPDATE
現在のDjango=アップデートの後に:
Django 1.10( link )
Django.core.urlresolvers
モジュールからのインポートは廃止され、新しい場所Django.urls
が採用されました
Django 2.0( link )
Django.core.urlresolvers
モジュールは削除され、新しい場所Django.urls
が採用されました。
したがって、正しい方法は次のとおりです。
from Django.urls import resolve
current_url = resolve(request.path_info).url_name
Django 1.5の時点で、これはリクエストオブジェクトからアクセスできます
current_url = request.resolver_match.url_name
https://docs.djangoproject.com/en/dev/ref/request-response/#Django.http.HttpRequest.resolver_match
URLパターンの名前空間を作成する人にとっては、名前空間のリクエストのURL名に興味があるかもしれません。この場合、Djangoはview_name
代わりに。
request.resolver_match.view_name
# return: <namespace>:<url name>
これは次の方法で実現できます。
request.resolver_match.url_name
Django> 1.8
質問の明確化:「ビューでは、そのような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の名前も知っておく必要があります。
あなたの質問からは少し不明瞭ですが、 http://docs.djangoproject.com/en/dev/topics/http/urls/ があなたが何を望んでいるかについての説明を提供するでしょう。
Djangoがリクエストを処理する方法に注意するのに特に便利です:
ユーザーがDjango搭載サイトからページをリクエストすると、これはシステムが実行するPythonコードを決定するために従うアルゴリズムです:
完全なパスの直後にいる場合は、次を試すことができます。
http://docs.djangoproject.com/en/dev/ref/request-response/#Django.http.HttpRequest.get_full_path
これが役立つことを願っています-URLconfモジュールの使用方法を示しており、正しい方向に導くのに役立つことを願っています。