通常,它们用于将每个应用程序的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等其他内容),在每个应用程序中查找urls.py
,并将这些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" %}
,因为它没有给定名称空间.