如何处理可重用 Django 应用程序中的命名空间 URL

How to Deal with Namespacing URLs in a Reusable Django App

我一直在努力使用可重用的 Django 应用程序逆转 URLs。这是我的问题的基本布局。

可重复使用的应用程序:

urls.py 文件中,它具有以下模式:

url(r'^object-list/$', ObjectListView.as_view(), name='object-list')

可重用应用程序 views.py 的某处,有以下反向调用:

reverse('object-list')

我的项目:

在我要使用此应用的项目中,我有另一个冲突的视图名称,因此我为应用的 URL 命名空间如下:

url(r'^app-stuff/', include('app.urls', namespace='app'))

问题:

这会导致应用程序中的所有反向调用在尝试查找 object-detail 时抛出 NoReverseMatch 异常,因为 URL 现在的名称是 app:object-detail.

我可以访问相关应用程序,因此我可以修改它对 reverse 的调用,但我希望以不涉及对命名空间进行硬编码的方式进行修改。我已经阅读了有关 include 函数的 current_appnamespace 参数的文档,但我不太明白它们是否有助于解决我遇到的问题。

非常感谢您的任何建议。

我仔细阅读 Django's docs on URL resolution 后解决了这个问题。

如果您有一个名为 myapp 的可重用应用程序,您可以将 属性 app_name 添加到其 URL 配置中,为其提供一个应用程序命名空间。示例:

# myapp/urls.py

app_name = 'myapp'

urlpatterns = [
    url(r'^index/$', IndexView.as_view(), name='index')
]

现在,即使像这样包含应用的 URL:

# project/urls.py

urlpatterns = [
    url(r'^myapp/', include('myapp.urls', namespace='random-namespace')),
]

...仍然可以使用 reverse('myapp:index').

访问这些网址

如果您想更详细地查看此内容,我创建了 a small GitHub repo with an example

编辑:

urls.py 中指定 app_name 属性 仅适用于 Django 1.9 及更高版本。对于 Django 1.8,您必须在 include() 函数中使用 app_name 参数。