编辑:我正在使用rest_framework.reverse并提供应用程序名称而不是反向查找的名称空间。反向调用的示例是:
reverse('api_app:system-detail', kwargs={...}, request=self.context.get('request'))
因此,我有一个带有单个应用程序的django项目,并且我有两个映射到该应用程序的不同的URL模式。我目前主要使用此方法,但是在某些情况下,使用reverse()会导致名称空间错误。我的基本urls.py看起来像这样:
from django.conf.urls import url, include
from django.views.generic.base import RedirectView
urlpatterns = [
url(r'^api/', include('api_project.api_app.urls',
namespace='api')),
url(r'^beta/api/', include('api_project.api_app.urls',
namespace='beta')),
url(r'^$', RedirectView.as_view(url='api', permanent=False),
name='index')
]
编辑:api_app.urls看起来像:
from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from . import views
from rest_framework.schemas import get_schema_view
schema_view = get_schema_view(title="Schema")
app_name = 'api_app'
urlpatterns = [
url(r'^$', views.APIRoot.as_view(), name='api-root'),
url(r'^schema/$', schema_view, name'api-schema'),
....
在大多数情况下,反向操作可以按预期进行,例如使用/ beta / endpoint在页面上具有如下链接:
/beta/endpoint/example
但是,在少数情况下,使用/ beta / endpoint的链接如下:
/api/endpoint/different-example
我的问题不是关于反向如何确定要使用哪个名称空间的问题,而是这是对同一应用程序使用两个名称空间的适当方法吗?这是我应该完全不同的方法吗?
到目前为止,我的大多数研究并没有取得太大的成功,所以我认为这可能根本上是错误的方法。
如果这种方法可行,那么我很好奇为什么反向返回返回的名称空间不一致。
答案 0 :(得分:1)
reversing namespaced URLs上的文档向您显示了发生的情况。对于您的情况,您要实例化同一个应用程序两次,一次使用实例名称空间api
,一次使用实例名称空间beta
。
您的应用程序名称空间为api_app
,由包含的urls.py文件中的app_name
变量定义。因此它与两个实例名称空间都不匹配,这意味着没有默认的应用程序实例。
因此,在您的情况下,URL解析器将大多数情况下解析为情况4:如果未在视图中指定current_app
,它将解析为最后部署的实例(即最后注册的实例),即是“测试版”。
在使用current_app
时和在reverse
对象上,都应在视图中指定request
(以便模板也可以正确解析)。