Django之URL的命名空间和命名模式

时间:2022-10-13 04:37:34

在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的名字