2013-10-04 23 views
24

Ich studiere die Django-Dokumentation, aber ich habe einen Teil, den ich nicht verstehen kann, welche Art von Problem es löst und die Dokumentation ist mir nicht klar. Jeder der es weiß, könntest du mir bitte ein echtes Beispiel dafür geben, wie Namespace in einem echten Problem benutzt wird. Ich kenne die Syntax, aber ich weiß nicht den Zweck dieser .. Ich konnte es nicht verstehen. DankeEin echtes Beispiel für URL-Namespace

Antwort

30

In der Regel werden sie verwendet, um die URLs jeder Anwendung in ihren eigenen Namespace zu stellen. Dies verhindert, dass die reverse() Django-Funktion und die {% url %} Vorlagenfunktion die falsche URL zurückgibt, da der URL-Mustername in einer anderen App übereinstimmte.

Was ich in meinem Projekt-Ebene urls.py Datei die folgende ist:

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

Hinweis der letzte Abschnitt: diese Anwendungen durchläuft ich installiert haben (settings.LOCAL_APPS ist eine Einstellung, die ich fügte hinzu, dass enthält nur meine apps (es wird zu INSTALLED_APPS hinzugefügt, das andere Dinge wie South hat), sucht nach einem urls.py in jedem von ihnen und importiert diese URLs in einen Namespace, der nach der App benannt wird, und legt diese URLs auch in einem URL-Unterverzeichnis ab, das nach der App benannt wird.

So zum Beispiel, wenn ich eine App hosts genannt haben, und hosts/urls.py wie folgt aussieht:

from django.conf.urls.defaults import * 

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

mein Jetzt views.py kann reverse("hosts:list") rufen Sie die URL der Seite zu erhalten, die hosts.views.show_hosts nennt, und es wird aussehen etwas wie "/hosts/". Gleiches gilt für {% url "hosts:list" %} in einer Vorlage. Auf diese Weise muss ich nicht befürchten, mit einer URL namens "list" in einer anderen App zu kollidieren, und ich muss nicht jeden Namen mit hosts_ voranstellen.

Beachten Sie, dass sich die Anmeldeseite unter {% url "login" %} befindet, da ihr kein Namespace zugewiesen wurde.

+2

Ich sehe mit rückgängig gemacht werden .. aber dies ist das gleiche wie ein Namen in eine URL setzen, nicht wahr? Machen Sie den gleichen Job .. –

+1

Jetzt sah ich die vollständige Antwort ... und es ist fantastisch ...Wenn ich es richtig verstanden habe, benutzt du den Namensraum zusammen mit der benannten URL .. damit du dir keine Sorgen machen musst, wenn du zwei Ansichten von verschiedenen Apps mit dem gleichen Namen benannt hast ... ist das richtig? –

+1

Ziemlich viel. Ich bin sicher, dass es andere und bessere Nutzungen gibt, aber das war ein schnelles Beispiel. –

0

Betrachten Sie eine URL-Muster verwenden, wie unten
url(r'^login/',include('app_name', name='login'))

Auch Sie Betrachten Sie eine Drittanbieter-App wie Django-RestFramework verwenden. Wenn Sie die App verwenden, müssen Sie die folgende Zeile in URLs Conf-Datei des Projekts deklarieren.

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

Nun, wenn Sie den Code der Ruhe-Rahmen überprüfen, werden Sie den Code unten in urls.py Datei finden

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

wir verwendet haben, login 'Name für ein URL-Muster in unserem Projekt und derselbe Name wird von Django-rest-framework für eines ihrer URL-Muster verwendet. Wenn Sie rückwärts ("Login") verwenden, wird Django verwirrt werden.
Um diese Art von Problemen zu beheben, verwenden wir Namespace.

@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-Namen eines Namespace werden niemals mit anderen Namespaces kollidieren.
A kann Namespace URL-Muster
reverse('namespace:url_name')

Verwandte Themen