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

时间:2016-06-27 17:55:32

标签: django django-urls

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

可重复使用的应用

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

问题:

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

我可以访问相关应用,因此我可以修改它对reverse的调用,但我希望这样做不会涉及对命名空间进行硬编码。我已阅读有关current_app函数的namespaceinclude参数的文档,但我不太清楚它们是否有助于解决我遇到的问题。

非常感谢您提出的任何建议。

1 个答案:

答案 0 :(得分:2)

我在仔细阅读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

修改

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