django.urls ユーティリティ関数Link to this heading

reverse()Link to this heading

コード内で url テンプレートタグと似たような機能を使用する必要がある場合、Django は次の関数を提供しています:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)Link to this definition

viewnameURL パターン名 または呼び出し可能なビューオブジェクトのいずれかを指定できます。例えば、以下の url を見てください:

Code
from news import views

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

URL を逆引きするために、以下の方法を使用できます:

Code
# 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 にそれらを渡すことができます。例えば:

Code
from django.urls import reverse


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

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

Python console
>>> 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_lazy()Link to this heading

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

reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None)Link to this definition

プロジェクトの URLConf がロードされる前に、URL 反転を使用する必要がある場合に役立ちます。この関数が必要となる一般的なケースには以下のようなものがあります:

  • クラスベースのジェネリックビューの url 属性に逆引きURLを提供する場合。

  • デコレータ(たとえば django.contrib.auth.decorators.permission_required() デコレータの login_url 引数など)への URL の逆引きを提供する場合。

  • 関数のシグネチャでパラメータのデフォルト値として逆引きURLを提供する場合。

resolve()Link to this heading

resolve() 関数は、URL パスを対応するビュー関数に解決するために使用できます。次のシグネチャを持っています:

resolve(path, urlconf=None)Link to this definition

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

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

class ResolverMatchLink to this definition
funcLink to this definition

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

argsLink to this definition

URL からパースされた、ビュー関数に渡される引数。

kwargsLink to this definition

ビュー関数に渡されるであろうすべてのキーワード引数、すなわち captured_kwargsextra_kwargs です。

captured_kwargsLink to this definition

URL から解析された、ビュー関数に渡されるキーワード引数がキャプチャされます。

extra_kwargsLink to this definition

ビュー関数に渡される追加のキーワード引数。

url_nameLink to this definition

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

routeLink to this definition

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

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

triedLink to this definition

URL が一致するか利用可能なパターンが尽きる前に試みられた URL パターンのリストです。

app_nameLink to this definition

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

app_namesLink to this definition

URL にマッチする URL パターンの完全なアプリケーション名前空間内の個別の名前空間コンポーネントのリストです。例えば、もし app_name'foo:bar' である場合、app_names['foo', 'bar'] になります。

namespaceLink to this definition

対応するURLのURLパターンのインスタンス名前空間。

namespacesLink to this definition

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

view_nameLink to this definition

URL にマッチするビューの名前で、名前空間が存在する場合はその名前空間を含みます。

その後、 ResolverMatch オブジェクトを調査して、URL に一致する URL パターンに関する情報を提供できます。

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

ResolverMatch オブジェクトは、3値タプルに代入することもできます:

Code
func, args, kwargs = resolve("/some/path/")

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

Code
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()Link to this heading

get_script_prefix()Link to this definition

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