我一直在努力使用可重用的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
函数的namespace
和include
参数的文档,但我不太清楚它们是否有助于解决我遇到的问题。
非常感谢您提出的任何建议。
答案 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()
参数。