2013-10-04 3 views
24

Я изучаю документацию Django, но мне нужно включить часть, которую я не могу понять, какую проблему она разрешает, и документация мне не понятна. Любой, кто знает, не могли бы вы предоставить мне реальный пример того, как использовать пространство имен в реальной проблеме. Я знаю синтаксис, но я не знаю цели этого. Я не мог понять. СпасибоНастоящий пример пространства имен URL-адресов

ответ

30

Как правило, они используются для размещения URL-адресов каждого приложения в их собственном пространстве имен. Это предотвращает функцию Django reverse() и функцию шаблона {% 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, который имеет другие вещи, такие как Юг), ищет в каждом из них 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" %}, поскольку ей не было предоставлено пространство имен.

+2

я вижу .. но это то же самое, как если поместить имя в URL, не так ли? Проделайте ту же работу .. –

+1

Теперь я увидел полный ответ ... и это потрясающе ...Если я правильно понял, вы используете пространство имен вместе с именованным URL-адресом .. так что вы не будете беспокоиться о том, что вы назвали два вида из разных приложений с тем же именем ... это правильно? –

+1

В значительной степени. Я уверен, что есть и другие применения, и лучшие, но это был быстрый пример. –

0

Рассмотрим вы используете шаблон URL-адрес, как показано ниже
url(r'^login/',include('app_name', name='login'))

Также Рассмотрим вы используете приложение стороннего как Django-RestFramework. Когда вы используете приложение, вы должны объявить следующую строку в файле confs проекта URL.

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) 

Теперь, если вы проверяете код покоя рамки, вы найдете ниже код в файле urls.py

urlpatterns = [ 
    url(r'^login/$', login, login_kwargs, name='login'), 
    url(r'^logout/$', logout, name='logout'), 
] 

Мы использовали «войти в» имя для шаблона URL в нашем проект и одно и то же имя используется в Django-rest-framework для одного из их шаблонов URL. Когда вы используете reverse («login»), Django запутается.
Для решения этих проблем мы используем пространство имен.

@register.simple_tag 
def optional_docs_login(request): 
    """ 
    Include a login snippet if REST framework's login view is in the URLconf. 
    """ 
    try: 
     login_url = reverse('rest_framework:login') 
    except NoReverseMatch: 
     return 'log in' 

URL-адреса пространства имен никогда не будут сталкиваться с другими пространствами имен.
пространства имён шаблон URL может быть изменено с помощью
reverse('namespace:url_name')

Смежные вопросы