如何处理可重用 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_app
和 namespace
参数的文档,但我不太明白它们是否有助于解决我遇到的问题。
非常感谢您的任何建议。
我仔细阅读 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
参数。
我一直在努力使用可重用的 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_app
和 namespace
参数的文档,但我不太明白它们是否有助于解决我遇到的问题。
非常感谢您的任何建议。
我仔细阅读 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
参数。