您的位置:首页 > 编程语言 > Go语言

基于 Django1.10 文档的深入学习(13)—— django.core.urlresolvers 之 reverse()

2017-04-26 21:18 621 查看

reverse()

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

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


viewname
可以是
URL
模式名称或可调用视图对象。例如,给出以下
url


from news import views

url(r'^archive/$', views.archive, name='news-archive')


您可以使用以下任何一项来反转网址:

# 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]))


args
kwargs
不能同时传递给
reverse()


如果不能匹配,则
reverse()
会引发
NoReverseMatch
异常。

reverse()
函数可以反转大量各种正则表达式模式的URL,但并不是每个可能的。目前的主要限制是该模式不能包含使用垂直条(
“|”
)字符的替代选择。您可以非常高兴地使用这样的模式来匹配传入的URL并将其发送到视图,但是您不能反转这种模式。

current_app
参数允许您向解析器提供一个提示,指示当前执行的视图所属的应用程序。根据命名空间的
URL
解析策略,此
current_app
参数用作提示将应用程序名称空间解析为特定应用程序实例的
URL


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


—-

what is reverse() in Django——StackOverFlow

in your
urls.py
define this:

url(r'^foo$', some_view, name='url_name'),


in a template you can then refer to this url as:

<!-- django <= 1.4 -->
<a href="{% url url_name %}">link which calls some_view</a>

<!-- django >= 1.5 or with {% load url from future %} in your template -->
<a href="{% url 'url_name' %}">link which calls some_view</a>
this will be rendered as

<a href="/foo/">link which calls some_view</a>


now say you want to do something similar in your
views.py
- e.g. you are handling some other url (not
/foo/
) in some other view (not
some_view
) and you want to redirect the user to
/foo/
(often the case on successful form submission)

you could just do

return HttpResponseRedirect('/foo/')


but what if you want to change the url in future - you’d have to update your
urls.py
and all references to it in your code. This violates DRY (google it).

instead you can say

from django.core.urlresolvers import reverse
return HttpResponseRedirect(reverse('url_name'))


This looks through all urls defined in your project for the url defined with the name
url_name
and returns the actual url
/foo/
.

this means that you refer to the url only by its
name
attribute - if you want to change the url itself or the view it refers to you can do this by editing one place only -
urls.py
. This whole idea of editing one place only is refered to as “Don’t Repeat Yourself” and is something to strive for.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐