django.urls
的实用函数¶自1.10版以来已弃用 在旧版本中,这些功能位于django.core.urlresolvers
中。 从旧位置导入将继续工作,直到Django 2.0。
reverse()
¶如果您需要在代码中使用类似于url
模板标记的内容,Django提供以下功能:
viewname
可以是URL pattern name或可调用视图对象。 例如,给定以下url
:
from news import views
url(r'^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)
如果网址接受参数,您可以在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
参数允许您向解析器提供指示当前正在执行的视图所属的应用程序的提示。
根据namespaced URL resolution strategy,此current_app
参数用作将应用程序命名空间解析为特定应用程序实例上的URL的提示。
urlconf
参数是包含用于反转的URL模式的URLconf模块。 默认情况下,使用当前线程的根URLconf。
注
reverse()
返回的字符串已经是urlquoted。 像这样:
>>> reverse('cities', args=['Orléans'])
'.../Orl%C3%A9ans/'
将进一步编码(例如urlquote()
或urllib.quote
)应用于reverse()
的输出可能会产生不良结果。
reverse_lazy()
¶惰性求值版本的reverse()。
reverse_lazy
(viewname, urlconf=None, args=None, kwargs=None, current_app=None)¶它在您需要在加载项目的URLConf之前使用URL反转时非常有用。 一些常见的需要此功能的情况是:
url
属性。django.contrib.auth.decorators.permission_required()
装饰器的login_url
参数)。resolve()
¶resolve()
函数可用于解析URL路径的相应视图函数。 它有以下定义:
path
是您要解析的网址路径。 与reverse()
一样,您不需要担心urlconf
参数。 该函数返回一个ResolverMatch
对象,允许您访问有关已解析URL的各种元数据。
如果URL不解析,该函数会引发Resolver404
异常(Http404
的子类)。
ResolverMatch
[source]¶func
¶将用于服务URL的视图函数
args
¶这将被传递到浏览功能,如从URL解析的参数。
kwargs
¶将被传递到视图函数的关键字参数,从URL解析。
url_name
¶与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'] t2 >。
view_name
¶与URL匹配的视图的名称,包括命名空间(如果有的话)。
然后可以询问ResolverMatch
对象,以提供有关与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 django.urls import resolve
from django.http import HttpResponseRedirect, Http404
from django.utils.six.moves.urllib.parse import urlparse
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
2017年9月6日