Django url的反向解析

在创建Django项目时,一个常见的需求时如何获得URL的最终形式以嵌入到所生成的Content中(即嵌入到视图中、或URL资源中,或者显示给用户的URL等)或着用于处理服务器端的导航流(如:重定向等)。但是,人们强烈希望不要硬编码这些URL或者设计一种与URLconf毫不相干的专门URL生成机制,因为这样容易导致一定程度上产生过期的URL。
Django提供了一个解决方案使得URL映射时URL设计唯一的储存库。你用你的URLconf填充它,然后可以双取向使用它。
● 根据用户/浏览器发起的URL请求,它调用正确的Django视图,并从URL中提取它的参数需要的值。
● 根据Django视图中的标识和将要传递给它的参数的值,获取与之关联的URL。
其中,第二种方式叫做反向解析URL、方向URL匹配、反向URL查询或者简单的URL反查。在需要URL的地方,对于不同层级,Django提供不同的工具用于URL反查:
● 在模版中:使用url模版标签
● 在Python代码中:使用django.core.urlresolvers.reverse()函数
● 在更高层次的雨处理Django模型是例相关代码中:使用get_absolute_url()方法
举个例子:
下面的URLconf:

from django.conf.urls import url
from . import views
urlpatterns = [
    #...
    url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
    #...
]

根据设计,某一年nnnn对应的归档的URL是/articles/nnnn/。
在模版的代码中使用下面的方法获取它们:

<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>

在Python代码中,这样使用:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))

猜你喜欢

转载自blog.csdn.net/spur_man/article/details/79362445