Ответ 1
Как правило, они используются для размещения URL-адресов каждого приложения в своем собственном пространстве имен. Это предотвращает возврат функции reverse()
Django и функции шаблона {% url %}
от неправильного URL-адреса, поскольку имя URL-шаблона совпало в другом приложении.
Что я имею в своем файле urls.py
уровне 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
который имеет другие вещи, такие как Юг), ищет 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")
чтобы получить URL-адрес страницы, вызывающей hosts.views.show_hosts
, и будет выглядеть примерно так: "/hosts/"
. То же самое касается {% url "hosts:list" %}
в шаблоне. Таким образом, мне не нужно беспокоиться о том, чтобы столкнуться с URL-адресом с именем "список" в другом приложении, и мне не нужно префиксно каждое имя с помощью hosts_
.
Обратите внимание, что страница входа находится в {% url "login" %}
поскольку ей не было предоставлено пространство имен.