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 yoururls.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 yourviews.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 itsname
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.