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

来源:互联网 发布:vb 数值转换为字符 编辑:程序博客网 时间:2024/06/15 11:29

reverse()

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

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

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

from news import viewsurl(r'^archive/$', views.archive, name='news-archive')

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

# using the named URLreverse('news-archive')# passing a callable object# (This is discouraged because you can't reverse namespaced views this way.)from news import viewsreverse(views.archive)

如果URL接受参数,您可以在args中传递它们。例如:

from django.urls import reversedef myview(request):    return HttpResponseRedirect(reverse('arch-summary', args=[1945]))

argskwargs不能同时传递给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 reversereturn HttpResponseRedirect(reverse('url_name'))

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

this means that you refer to the url only by itsnameattribute - 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.

0 0
原创粉丝点击