在Django中可以有多个URL指向一个一个视图,如:
urlpatterns = patterns('',
url(r'^archive/(\d{4})/$', archive),
url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}),
)
这是可行的,当对于我上一篇记录的Django之逆向解析url就有困难了,因为同一个视图
有两个结果可以匹配,这里就用到了url()函数的参数name
可以这样:
urlpatterns = patterns('',这里对每一个试图对应的正则匹配一个名字,在模板中可以这样使用:
url(r'^archive/(\d{4})/$', archive, name="full-archive"),
url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, name="arch-summary"),
)
{% url 'arch-summary' 1945 %}
{% url 'full-archive' 2007 %}
这样,使用url的逆向解析就一对一了,当然还有更好的解决方案,就是url的命名空间
1.命名空间:
就是在指定的name参数中加入冒号分割,如:myapp:index,表示命名空间为myapp,名字是index,
在使用时,可以这样:
{% url 'myapp:index' 1945 %}这样就能定位到指定的URLconf所指定的视图中。
2.url的命名空间,和include(URLconf)函数
在URLconf中可以使用include()函数,这个函数包含的也是一个URLconf,,但可以添加两个命名空间
1.应用程序级别application,的命名空间
2.实例级别instance的命名空间
例如:
url(r'^help/', include('apps.help.urls', namespace='foo', app_name='bar')),
这里app_name指定的是application级别的命名空间,而namespace指定的是instance级别的命名空间
所以可以这样来使用foo:bar:试图名,如对以下例子:
help_patterns = patterns('',
url(r'^basic/$', 'apps.help.views.views.basic',name='basic'),
url(r'^advanced/$', 'apps.help.views.views.advanced', name='advanced'),
)
url(r'^help/', include(help_patterns, 'bar', 'foo')),
解释一下:这里实际上是两个URLconf,但是通过include函数来把两个联合为一个URLconf了
所以,在模板中可以这样来使用,foo:bar:basic来引用,这样对于url逆向解析就不会出错了,
其中,application级别的命名空间包含instance级别的空间,其实,默认,每个app模块都有一个
命名空间,就是app的名字