通常,它们用于将每个应用程序的 URL 放入自己的命名空间中。这可以防止 reverse() Django 函数和 {% url %} 模板函数返回错误的 URL,因为 URL 模式名称恰好在另一个应用程序中匹配。
我的项目级 urls.py 文件中的内容如下:
from django.conf.urls.defaults import *
from django.conf import settings
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', 'main.views.main', name='main'),
url(r'^login$', 'django.contrib.auth.views.login', name="login"),
url(r'^logout$', 'django.contrib.auth.views.logout',
{"next_page": "/"}, name="logout"),
# Admin
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/', include(admin.site.urls)),
)
# Auto-add the applications.
for app in settings.LOCAL_APPS:
urlpatterns += patterns('',
url(r'^{0}/'.format(app), include(app + '.urls', namespace=app)),
)
请注意最后一部分:这将通过我已安装的应用程序(settings.LOCAL_APPS 是我添加的仅包含我的应用程序的设置;它被添加到 INSTALLED_APPS,其中包含其他内容,例如 South),查找 @ 987654327@,并将这些 URL 导入以应用命名的命名空间,并将这些 URL 放入以应用命名的 URL 子目录中。
因此,例如,如果我有一个名为 hosts 的应用,而 hosts/urls.py 看起来像:
from django.conf.urls.defaults import *
urlpatterns = patterns('hosts.views',
url(r'^$', 'show_hosts', name='list'),
)
现在我的views.py 可以调用reverse("hosts:list") 来获取调用hosts.views.show_hosts 的页面的URL,它看起来像"/hosts/"。模板中的{% url "hosts:list" %} 也是如此。这样我就不必担心在另一个应用程序中与名为“list”的 URL 发生冲突,也不必在每个名称前加上 hosts_。
请注意,登录页面位于{% url "login" %},因为它没有指定命名空间。