基于 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——StackOverFlowin your
urls.pydefine 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.pyand 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_nameand returns the actual url
/foo/.
this means that you refer to the url only by its
nameattribute - 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.
相关文章推荐
- 基于 Django1.10 文档的深入学习(13)—— Making queries 之 Q objects
- 基于 Django1.10 文档的深入学习(27)—— django.conf.urls utility functions 之 url(),include(),static()
- 基于 Django1.10 文档的深入学习(28)—— Managing static files(e.g. images, JavaScript, CSS)
- 基于 Django1.10 文档的深入学习(7)—— Configuring applications
- 基于 Django1.10 文档的深入学习(15)——django.contrib.auth.hashers
- 基于 Django1.10 文档的深入学习(11)—— django.shortcuts 之 render()
- 基于 Django1.10 文档的深入学习(23)—— QuerySet API reference 之 icontains
- 基于 Django1.10 文档的深入学习(2)—— Settings.py 之 STATIC_*
- 基于 Django1.10 文档的深入学习(8)—— Model field reference 之 choices
- 基于 Django1.10 文档的深入学习(4)—— models.py 之 class Meta
- 基于 Django1.10 文档的深入学习(14)—— Request and response objects 之 HttpResponse objects
- 基于 Django1.10 文档的深入学习(17)——Customizing authentication 之 Custom users and permissions
- 基于 Django1.10 文档的深入学习(16)——Authentication backends 之 class ModelBackend
- 基于 Django1.10 文档的深入学习(29)——Built-in Views 之 static.serve()
- 基于 Django1.10 文档的深入学习(9)—— Extra instance methods 之 get_FOO_display()
- 基于 Django1.10 文档的深入学习(20)—— Using the Django authentication system 之 login()
- 基于 Django1.10 文档的深入学习(26)—— Creating forms from models 之 基础
- 基于 Django1.10 文档的深入学习(22)——Sending email 之 send_mail()
- 基于 Django1.10 文档的深入学习(24)—— Form and field validation 之 cleaned_data
- 基于 Django1.10 文档的深入学习(12)—— django.shortcuts 之 redirect()