Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用:
- 有客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,调用相应的试图,获取相应的数据,然后返回给客户端显示
- 通过一个视图的名字,再加上一些参数和值,逆向获取相应的URL
第一个就是平常的请求有URLconf来解析的过程,
第二个叫做,url的逆向解析,url逆向匹配,url的逆向查阅,等
Django提供了不同的层级的url逆向处理工具:
- 在模板templates中,使用url标记,如:{% url %}
- 在Python代码中,使用django.core.urlresolvers.reverse()方法
- 在更高一层级的处理url中,用get_absolute_url()方法
例
看如下的URLconf:
- from django.conf.urls import patterns, url
- urlpatterns = patterns('',
- #...
- url(r'^articles/(\d{4})/$', 'news.views.year_archive'),
- #...
- )
根据设计,这个url的目的是将是nnnn年的文章存档(archive),即/articles/nnnn/
1.在模板中,可以这样来使用:
- <a href="{% url 'news.views.year_archive' 2012 %}">2012 Archive</a>
- {# Or with the year in a template context variable: #}
- <ul>
- {% for yearvar in year_list %}
- <li><a href="{% url 'news.views.year_archive' yearvar %}">{{ yearvar }} Archive</a></li>
- {% endfor %}
- </ul>
解释一下:首先,根据视图 'news.views.year_artichive'可以定位到指定的URLconf中,然后后面的2012来填充articles/\d{4}
最终的结果为<a href="articles/2012/">2012 Archive</a>,这里就是根据试图和所提供的值来逆向查询url
下面的类似,
2.在python代码中
- from django.core.urlresolvers import reverse
- from django.http import HttpResponseRedirect
- def redirect_to_year(request):
- # ...
- year = 2006
- # ...
- return HttpResponseRedirect(reverse('news.views.year_archive', args=(year,)))
解释一下:首先,必须引入django.core.urlresolvers.reverse() 方法,然后原理就是,根据提供的试图和参数
的值来逆向查找URLconf,匹配相应的url然后把值拿回来,最后,reverse()返回的值为:articles/2006/,这样就逆向的查出了需要的url