A real example of URL Namespace

前端 未结 3 1407
囚心锁ツ
囚心锁ツ 2020-12-07 15:47

I am studying the Django documentation, but I encountered a part that I cannot understand: what is a real example of how use to use a namespace in a real problem. I know the

3条回答
  •  南方客
    南方客 (楼主)
    2020-12-07 16:21

    Typically, they are used to put each application's URLs into their own namespace. This prevents the reverse() Django function and the {% url %} template function from returning the wrong URL because the URL-pattern name happened to match in another app.

    What I have in my project-level urls.py file is the following:

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

    Note the last section: this goes through the applications I have installed (settings.LOCAL_APPS is a setting I added that contains only my apps; it gets added to INSTALLED_APPS which has other things like South), looks for a urls.py in each of them, and imports those URLs into a namespace named after the app, and also puts those URLs into a URL subdirectory named after the app.

    So, for example, if I have an app named hosts, and hosts/urls.py looks like:

    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('hosts.views',
        url(r'^$', 'show_hosts', name='list'),
    )
    

    Now my views.py can call reverse("hosts:list") to get the URL to the page that calls hosts.views.show_hosts, and it will look something like "/hosts/". Same goes for {% url "hosts:list" %} in a template. This way I don't have to worry about colliding with a URL named "list" in another app, and I don't have to prefix every name with hosts_.

    Note that the login page is at {% url "login" %} since it wasn't given a namespace.

提交回复
热议问题