django.urls 工具函式

reverse()

如果您需要在程式碼中使用類似 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]))

您也可以傳遞 kwargs 而不是 args。例如

>>> 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() 傳回的字串已經是 url 編碼。例如

>>> 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 參數。該函式會傳回一個 ResolverMatch 物件,您可以使用它來存取有關已解析 URL 的各種中繼資料。

如果 URL 無法解析,該函式會引發 Resolver404 例外 ( Http404 的子類別)。

class ResolverMatch[原始碼]
func

將用於服務 URL 的視圖函式

args

將作為從 URL 解析的引數傳遞給視圖函式的引數。

kwargs

將傳遞給視圖函式的所有關鍵字引數,即 captured_kwargsextra_kwargs

captured_kwargs

將作為從 URL 解析的關鍵字引數傳遞給視圖函式的捕獲關鍵字引數。

extra_kwargs

將傳遞給視圖函式的額外關鍵字引數。

url_name

與 URL 匹配的 URL 模式的名稱。

route

匹配 URL 模式的路由。

例如,如果 path('users/<id>/', ...) 是匹配模式,則 route 將包含 'users/<id>/'

tried

在 URL 匹配或用盡可用模式之前嘗試的 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,則 namespaces 將會是 ['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() 的一種可能用途是測試視圖是否會在重定向到該視圖之前引發 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()[原始碼]

通常,您應該始終使用 reverse() 來定義應用程式內的 URL。但是,如果您的應用程式本身建構了 URL 階層的一部分,您可能偶爾需要產生 URL。在這種情況下,您需要能夠找到 Django 專案在其 Web 伺服器中的基本 URL(通常,reverse() 會為您處理此問題)。在這種情況下,您可以呼叫 get_script_prefix(),它會傳回 Django 專案的 URL 的腳本前綴部分。如果您的 Django 專案位於其 Web 伺服器的根目錄,則它始終是 "/"

警告

此函式不能在請求-回應週期之外使用,因為它依賴於該週期期間初始化的值。

返回頂部