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/'
args
和 kwargs
不能同时传递给 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
属性。 - 向装饰器(例如
django.contrib.auth.decorators.permission_required()
装饰器的login_url
参数)提供反转的 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_kwargs
和extra_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']
。
-
命名空间
¶ 与 URL 匹配的 URL 模式的实例命名空间。
-
命名空间
¶ 与 URL 匹配的 URL 模式的完整实例命名空间中的各个命名空间组件的列表。即,如果命名空间是
foo:bar
,则命名空间将是['foo', 'bar']
。
-
视图名称
¶ 与 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。在这种情况下,您需要能够在 Web 服务器中找到 Django 项目的基 URL(通常,reverse()
会为您处理此问题)。在这种情况下,您可以调用 get_script_prefix()
,它将返回 Django 项目的 URL 中的脚本前缀部分。如果您的 Django 项目位于其 Web 服务器的根目录,则它始终为 "/"
。
警告
此函数不能在请求-响应周期之外使用,因为它依赖于该周期中初始化的值。