2013-10-04 20 views
24

Studiuję dokumentację Django, ale muszę w części, że nie mogę zrozumieć, jaki rodzaj problemu rozwiązuje, a dokumentacja nie jest dla mnie jasne. Każdy, kto wie, czy mógłbyś podać mi prawdziwy przykład wykorzystania przestrzeni nazw w prawdziwym problemie. Znam składnię, ale nie znam celu tego ... Nie mogłem zrozumieć. DziękiPrawdziwy przykład adresu URL Przestrzeń nazw

Odpowiedz

30

Zazwyczaj są one używane do umieszczania adresów URL poszczególnych aplikacji w ich własnych obszarach nazw. Zapobiega to funkcji zwracania nieprawidłowego adresu URL przez funkcję szablonu Django i funkcji szablonu , ponieważ nazwa wzorca adresu URL pasuje do innej aplikacji.

Co mam w moim projekcie poziomu urls.py plik jest następujący:

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)), 
    ) 

Uwaga ostatni odcinek: to przechodzi wniosków Mam zainstalowany (settings.LOCAL_APPS jest ustawienie I dodał, że zawiera wyłącznie moje aplikacje , zostanie dodany do INSTALLED_APPS, który ma inne rzeczy, takie jak Południe), szuka w każdym z nich urls.py i importuje te URL-e do przestrzeni nazw nazwanej po aplikacji, a także umieszcza te adresy URL w podkatalogu URL nazwanym po aplikacji.

Tak więc, na przykład, jeśli mam aplikację o nazwie hosts i hosts/urls.py wygląda następująco:

from django.conf.urls.defaults import * 

urlpatterns = patterns('hosts.views', 
    url(r'^$', 'show_hosts', name='list'), 
) 

teraz mój views.py mogą dzwonić reverse("hosts:list") aby uzyskać adres URL do strony, która nazywa hosts.views.show_hosts i będzie wyglądać coś jak "/hosts/". To samo dotyczy {% url "hosts:list" %} w szablonie. W ten sposób nie muszę się martwić o kolizję z adresem URL o nazwie "list" w innej aplikacji i nie muszę poprzedzać każdej nazwy prefiksem hosts_.

Należy zauważyć, że strona logowania ma numer {% url "login" %}, ponieważ nie podano jej przestrzeni nazw.

+2

widzę .. ale to jest taka sama, jak umieszczenie nazwy w adresie URL, prawda? Wykonaj tę samą pracę .. –

+1

Teraz zobaczyłem pełną odpowiedź ... i jest niesamowita ...Jeśli mam to prawo, używasz przestrzeni nazw wraz z nazwanym adresem URL, abyś nie martwił się, gdybyś nazwał dwa widoki z różnych aplikacji o tej samej nazwie ... czy to prawda? –

+1

Dość dużo. Jestem pewien, że są inne zastosowania i lepsze, ale to był szybki przykład. –

0

Rozważmy używasz wzorca url jak poniżej
url(r'^login/',include('app_name', name='login'))

także rozważyć używasz aplikacji innych firm, takich jak Django RestFramework. Podczas korzystania z aplikacji, musisz zadeklarować następujący wiersz w pliku URL conf projektu.

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

Teraz sprawdzając kod Rest-ram, znajdziesz poniższy kod w pliku urls.py

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

Użyliśmy „login” nazwę wzorca adresu URL w naszym projekt i ta sama nazwa jest używana przez Django-rest-framework dla jednego ze wzorców adresów URL. Gdy użyjesz reverse ("login"), Django się pomyli.
Aby rozwiązać tego typu problemy, używamy przestrzeni nazw.

@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' 

Nazwy adresów URL przestrzeni nazw nigdy nie będą kolidować z innymi obszarami nazw.
przestrzeni nazw wzorzec URL można odwrócić za pomocą
reverse('namespace:url_name')