django.urls 效用函数

reverse()

reverse() 函数可用于返回给定视图和可选参数的绝对路径引用,类似于 url 标签:

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None, *, query=None, fragment=None)[源代码]

viewname 可以是 URL pattern name 或URLinf中使用的可调用视图对象。例如,鉴于以下内容 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 根据 namespaced URL resolution strategy .

这个 urlconf 参数是包含用于反转的URL模式的urlconf模块。默认情况下,使用当前线程的根urlconf。

query 关键字参数指定要添加到返回的URL的参数。它可以接受 QueryDict (such作为 request.GET )或任何与之兼容的值 urllib.parse.urlencode() .编码后的查询字符串被追加到解析后的URL, ? .

fragment 关键字参数指定要附加到返回的URL的片段标识符(即,在路径和查询字符串之后,前面是 # ).

例如:

>>> from django.urls import reverse
>>> reverse("admin:index", query={"q": "biscuits", "page": 2}, fragment="results")
'/admin/?q=biscuits&page=2#results'
>>> reverse("admin:index", query=[("color", "blue"), ("color", 1), ("none", None)])
'/admin/?color=blue&color=1&none=None'
>>> reverse("admin:index", query={"has empty spaces": "also has empty spaces!"})
'/admin/?has+empty+spaces=also+has+empty+spaces%21'
>>> reverse("admin:index", fragment="no encoding is done")
'/admin/#no encoding is done'
Changed in Django 5.2:

queryfragment 添加了论点。

备注

返回的字符串 reverse() 已经是 urlquoted 。例如:

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

应用进一步的编码(例如 urllib.parse.quote() )到的输出 reverse() 可能会产生不良结果。

按视图对象反转基于类的视图

视图对象也可以是调用的结果 as_view() 如果URLConf中使用相同的视图对象。按照原始示例,视图对象可以定义为:

news/views.py
 from django.views import View


 class ArchiveView(View): ...


 archive = ArchiveView.as_view()

但是,请记住,命名空间的视图不能被视图对象反转。

reverse_lazy()

延迟评估的版本 reverse() .

reverse_lazy(viewname, urlconf=None, args=None, kwargs=None, current_app=None, *, query=None, fragment=None)

当您需要在加载项目的urlconf之前使用URL反转时,它非常有用。一些需要此功能的常见情况是:

  • 提供一个反向的URL作为 url 基于类的通用视图的属性。

  • 为修饰符提供反向的URL(例如 login_url 的参数 django.contrib.auth.decorators.permission_required() 装饰师)

  • 提供一个反向的URL作为函数签名中参数的默认值。

Changed in Django 5.2:

queryfragment 添加了论点。

resolve()

这个 resolve() 函数可用于将URL路径解析为相应的视图函数。签字如下:

resolve(path, urlconf=None)[源代码]

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

如果URL未解析,则函数将引发 Resolver404 例外(子类 Http404

class ResolverMatch[源代码]
func

将用于为URL提供服务的视图函数

args

从URL解析的将传递给视图函数的参数。

kwargs

将传递给view函数的所有关键字参数,即 captured_kwargsextra_kwargs

captured_kwargs

从URL解析的、将被传递给view函数的捕获的关键字参数。

extra_kwargs

将传递给view函数的其他关键字参数。

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匹配的视图的名称,包括命名空间(如果有)。

A ResolverMatch 然后可以询问对象,以提供有关与URL匹配的URL模式的信息::

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

A ResolverMatch 对象也可以分配给三个:

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

一种可能的用途 resolve() 将测试一个视图是否会引发 Http404 重定向到它之前出错::

from urllib.parse import urlsplit
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(urlsplit(next).path)
    kwargs["request"] = request
    try:
        view(*args, **kwargs)
    except Http404:
        return HttpResponseRedirect("/")
    return response

get_script_prefix()

get_script_prefix()[源代码]

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

警告

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