<h3>更新2(2019-10-09)</h3>
<p>正如eugene所说,UPDATE 1不再适用于Django的最新版本,后者要求在包含它时在<code>urls.py</code>中定义<code>app_name</code>。</p>
<p><a href="https://github.com/philgyford/django-url-namespace-example" rel="nofollow noreferrer">On GitHub I've created a Django project</a>(<code>myproject</code>)和几个应用程序(<code>products</code>和<code>books</code>)来演示如何创建嵌套命名空间。总之,各种<code>urls.py</code>看起来如下:</p>
<pre class="lang-py prettyprint-override"><code># myproject/urls.py
from django.urls import include, path
from products import urls as products_urls
from products import views
urlpatterns = [
path("", views.site_home, name="home"),
path("products/", include(products_urls, namespace="products"),)
]
</code></pre>
<pre class="lang-py prettyprint-override"><code># products/urls.py
from django.urls import include, path
from books import urls as books_urls
from . import views
app_name = "products"
urlpatterns = [
path("", views.index, name="product_index"),
path("books/", include(books_urls, namespace="books")),
]
</code></pre>
<pre class="lang-py prettyprint-override"><code># books/urls.py
from django.urls import path
from . import views
app_name = "books"
urlpatterns = [
path("", views.index, name="book_index"),
path("<slug:book_slug>/", views.detail, name="book_detail"),
]
</code></pre>
<p>因此,您可以像这样使用这些嵌套的URL名称:</p>
<pre class="lang-py prettyprint-override"><code>reverse("products:books:book_index")
# '/products/books/'
reverse("products:books:book_detail", kwargs={"book_slug": "my-book"})
# '/products/books/my-book/'
</code></pre>
<hr/>
<h3>更新1</h3>
<p>Django 2.0引入了两个相关的更改。首先,<code>urls()</code>函数现在在<code>django.urls</code>中,因此上面的<code>urls.py</code>示例的第一行是:</p>
<pre class="lang-py prettyprint-override"><code>from django.urls import include, url
</code></pre>
<p>其次,它引入了<code>path()</code>函数,作为不需要正则表达式的路径的更简单的替代方法。使用它,示例<code>urls.py</code>如下:</p>
<pre class="lang-py prettyprint-override"><code>from django.urls import include, path
nested2 = [
path('index/', 'index', name='index'),
]
nested1 = [
path('nested2/', include(nested2, namespace='nested2')),
path('index/', 'index', name='index'),
]
urlpatterns = [
path('nested1/', include(nested1, namespace='nested1')),
]
</code></pre>
<hr/>
<h3>原始答案</h3>
<p>虽然Yuji的答案是正确的,但是请注意,<code>django.conf.urls.patterns</code>不再存在(因为Django 1.10),而是使用普通列表。</p>
<p>同样的例子<code>urls.py</code>现在应该是这样的:</p>
<pre class="lang-py prettyprint-override"><code>from django.conf.urls import include, url
nested2 = [
url(r'^index/$', 'index', name='index'),
]
nested1 = [
url(r'^nested2/', include(nested2, namespace='nested2')),
url(r'^index/$', 'index', name='index'),
]
urlpatterns = [
url(r'^nested1/', include(nested1, namespace='nested1')),
]
</code></pre>
<p>仍然像这样使用:</p>
<pre class="lang-py prettyprint-override"><code>reverse('nested1:nested2:index') # should output /nested1/nested2/index/
reverse('nested1:index') # should output /nested1/index/
</code></pre>