Django: 路由与视图 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

带参URL反向解析

如果需要在另一个子系统里为你的报表子系统生成链接URL该怎么做?

让我们先给你的报表子系统的路由表项命名:

urlpatterns = [
    url(r'^$',v_report_index,name='r_index'),
    url(r'^income/([0-9]{4})/$',v_report_income_year,name='r_income_year'),
    url(r'^income/([0-9]{4})/([0-9]{2})/$',v_report_income_month,name='r_income_month'),
]

对于第一个路由项,直接使用reverse('r_index')毫无压力。但是对后两个路由项,如果按原来的方式 会提示错误:

Traceback (most recent call last):
...
django.core.urlresolvers.NoReverseMatch: Reverse for 'r_income_year' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: ['report/income/([0-9]{4})/$']

这是因为后面两个路由项的URL模式是包含参数(正则分组)的正则表达式。当Django正向解析URL 时,会从URL中根据路由项的正则模式提取参数;同样,当反向生成URL时,就需要给reverse() 传入对等的参数。

匿名分组

对于规则中包含匿名分组的路由项,应当使用args关键字参数传入一个元组,其成员顺序与 路由规则表达式中的分组相对应。

因此,对于报表子系统路由表的后两项,我们可以执行如下的调用:

print reverse('r_income_year',args=('2015',))  
print reverse('r_income_month',args=('2015','10',))

命名分组

对于规则中包含命名分组的路由项,应当使用kwargs关键字参数传入一个字典,各键名与 路由规则表达式中各分组名向对应。

因此,如果报表子系统的路由表项URL正则模式采用命名分组,例如:

urlpatterns = [
    url(r'^$',v_report_index,name='r_index'),
    url(r'^income/(?P&ltyear>[0-9]{4})/$',v_report_income_year,name='r_income_year'),
    url(r'^income/(?P&ltyear>[0-9]{4})/(?P&ltmonth>[0-9]{2})/$',v_report_income_month,name='r_income_month'),
]

那么应当按如下的方式调用reverse()

print reverse('r_income_year',kwargs={'year':'2015'})
print reverse('r_income_month',kwargs={'year':'2015','month':'12'})
思考一下,如果不同路由表中的路由项重名,会怎么样?在示例代码中试一下!