django.urls 实用函数

reverse()

如果您需要在代码中使用类似于 url 模板标签的功能,Django 提供了以下函数

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None)[source]

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 属性。

  • 向装饰器(例如 django.contrib.auth.decorators.permission_required() 装饰器的 login_url 参数)提供反转的 URL。

  • 在函数签名的参数中提供反转的 URL 作为默认值。

resolve()

resolve() 函数可用于将 URL 路径解析为相应的视图函数。它具有以下签名

resolve(path, urlconf=None)[source]

path 是您要解析的 URL 路径。与 reverse() 一样,您不必担心 urlconf 参数。该函数返回一个 ResolverMatch 对象,允许您访问有关已解析 URL 的各种元数据。

如果 URL 未解析,则该函数将引发 Resolver404 异常(Http404 的子类)。

class ResolverMatch[source]
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,则命名空间将是 ['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()[source]

通常,您应该始终使用 reverse() 来定义应用程序中的 URL。但是,如果您的应用程序本身构建 URL 层次结构的一部分,则您可能偶尔需要生成 URL。在这种情况下,您需要能够找到 Django 项目在其 Web 服务器中的基本 URL(通常,reverse() 会为您处理此问题)。在这种情况下,您可以调用 get_script_prefix(),它将返回 Django 项目的 URL 的脚本前缀部分。如果您的 Django 项目位于其 Web 服务器的根目录下,则这始终为 "/"

警告

此函数**不能**在请求-响应周期之外使用,因为它依赖于在该周期中初始化的值。

返回顶部