django.urls 实用函数 — Django 文档
django.urls 实用功能
reverse()
如果你需要在你的代码中使用类似于 :ttag:`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
参数允许您向解析器提供提示,指示当前正在执行的视图所属的应用程序。 根据 命名空间 URL 解析策略 ,此 current_app
参数用作将应用程序命名空间解析为特定应用程序实例上的 URL 的提示。
urlconf
参数是 URLconf 模块,包含用于反向的 URL 模式。 默认情况下,使用当前线程的根 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
属性。 - 向装饰器提供反向 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
从 URL 中解析出的可能传递给视图函数的关键字参数。
- url_name
与 URL 匹配的 URL 模式的名称。
- route
2.2 版中的新功能。
匹配 URL 模式的路径。
例如,如果
path('users/<id>/', ...)
是匹配模式,则route
将包含'users/<id>/'
。
- app_name
匹配 URL 模式的应用程序命名空间。
- app_names
与 URL 匹配的 URL 模式的完整应用程序命名空间中各个命名空间组件的列表。 例如,如果
app_name
是'foo:bar'
,那么app_names
将是['foo', 'bar']
。
- namespace
匹配 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