django.urlsユーティリティ関数—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/ref/urlresolvers
移動先:案内検索

django.urlsユーティリティ機能

reverse()

コードで:ttag: `url` テンプレートタグに似たものを使用する必要がある場合、Djangoは次の関数を提供します。

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)

viewnameは、 URLパターン名または呼び出し可能なビューオブジェクトにすることができます。 たとえば、次のurlがあるとします。

from news import views

path('archive/', views.archive, name='news-archive')

次のいずれかを使用して、URLを逆にすることができます。

# using the named URL
reverse('news-archive')

# passing a callable object
# (This is discouraged because you can't reverse namespaced views this way.)
from news import views
reverse(views.archive)

URLが引数を受け入れる場合は、argsでそれらを渡すことができます。 例えば:

from django.urls import reverse

def myview(request):
    return HttpResponseRedirect(reverse('arch-summary', args=[1945]))

argsの代わりにkwargsを渡すこともできます。 例えば:

>>> reverse('admin:app_list', kwargs={'app_label': 'auth'})
'/admin/auth/'

argskwargsを同時にreverse()に渡すことはできません。

一致するものがない場合、reverse()NoReverseMatch 例外を発生させます。

reverse()関数は、URLのさまざまな正規表現パターンを逆にすることができますが、すべての可能なパターンを逆にすることはできません。 現時点での主な制限は、縦棒("|")文字を使用した代替選択肢をパターンに含めることができないことです。 このようなパターンを使用して、受信URLと照合し、ビューに送信することはできますが、そのようなパターンを元に戻すことはできません。

current_app引数を使用すると、現在実行中のビューが属するアプリケーションを示すヒントをリゾルバーに提供できます。 このcurrent_app引数は、名前空間URL解決戦略に従って、アプリケーション名前空間を特定のアプリケーションインスタンス上のURLに解決するためのヒントとして使用されます。

urlconf引数は、反転に使用するURLパターンを含むURLconfモジュールです。 デフォルトでは、現在のスレッドのルートURLconfが使用されます。

ノート

reverse()によって返される文字列は、すでに urlquoted です。 例えば:

>>> reverse('cities', args=['Orléans'])
'.../Orl%C3%A9ans/'

reverse()の出力にさらにエンコード(urllib.parse.quote()など)を適用すると、望ましくない結果が生じる可能性があります。


reverse_lazy()

reverse()の遅延評価バージョン。

reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None)

これは、プロジェクトのURLConfがロードされる前にURL反転を使用する必要がある場合に役立ちます。 この機能が必要な一般的なケースは次のとおりです。

  • ジェネリッククラスベースビューのurl属性として逆URLを提供します。
  • デコレータに逆URLを提供します( django.contrib.auth.decorators.permission_required()デコレータのlogin_url引数など)。
  • 関数のシグニチャのパラメータのデフォルト値として逆URLを提供します。


resolve()

resolve()関数は、対応するビュー関数へのURLパスを解決するために使用できます。 次の署名があります。

resolve(path, urlconf=None)

pathは、解決するURLパスです。 reverse()と同様に、urlconfパラメーターについて心配する必要はありません。 この関数は、解決されたURLに関するさまざまなメタデータにアクセスできる ResolverMatch オブジェクトを返します。

URLが解決されない場合、関数は Resolver404 例外( Http404 のサブクラス)を発生させます。

class ResolverMatch
func

URLを提供するために使用されるビュー機能

args

URLから解析されたときにview関数に渡される引数。

kwargs

URLから解析されたときにview関数に渡されるキーワード引数。

url_name

URLに一致するURLパターンの名前。

route

一致するURLパターンのルート。

たとえば、path('users/<id>/', ...)が一致するパターンである場合、routeには'users/<id>/'が含まれます。

tried

バージョン3.2の新機能。

URLが1つに一致するか、使用可能なパターンを使い果たす前に試行されたURLパターンのリスト。

app_name

URLに一致するURLパターンのアプリケーション名前空間。

app_names

URLに一致するURLパターンの完全なアプリケーション名前空間内の個々の名前空間コンポーネントのリスト。 たとえば、app_name'foo:bar'の場合、app_names['foo', 'bar']になります。

namespace

URLに一致するURLパターンのインスタンス名前空間。

namespaces

URLに一致するURLパターンの完全なインスタンス名前空間内の個々の名前空間コンポーネントのリスト。 つまり、名前空間がfoo:barの場合、名前空間は['foo', 'bar']になります。

view_name

URLに一致するビューの名前(名前空間がある場合はそれを含む)。

次に、 ResolverMatch オブジェクトに問い合わせて、URLに一致するURLパターンに関する情報を提供できます。

# Resolve a URL
match = resolve('/some/path/')
# Print the URL pattern that matches the URL
print(match.url_name)

ResolverMatch オブジェクトをトリプルに割り当てることもできます。

func, args, kwargs = resolve('/some/path/')

resolve()の1つの可能な使用法は、ビューにリダイレクトする前に、ビューがHttp404エラーを発生させるかどうかをテストすることです。

from urllib.parse import urlparse
from django.urls import resolve
from django.http import Http404, HttpResponseRedirect

def myview(request):
    next = request.META.get('HTTP_REFERER', None) or '/'
    response = HttpResponseRedirect(next)

    # modify the request and response as required, e.g. change locale
    # and set corresponding locale cookie

    view, args, kwargs = resolve(urlparse(next)[2])
    kwargs['request'] = request
    try:
        view(*args, **kwargs)
    except Http404:
        return HttpResponseRedirect('/')
    return response

get_script_prefix()

get_script_prefix()

通常、アプリケーション内のURLを定義するには、常に reverse()を使用する必要があります。 ただし、アプリケーションがURL階層自体の一部を構築する場合は、URLを生成する必要がある場合があります。 その場合、Webサーバー内でDjangoプロジェクトのベースURLを見つけることができる必要があります(通常、 reverse()がこれを処理します)。 その場合、get_script_prefix()を呼び出すことができます。これにより、DjangoプロジェクトのURLのスクリプトプレフィックス部分が返されます。 DjangoプロジェクトがそのWebサーバーのルートにある場合、これは常に"/"です。