编辑:我正在使用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
我的问题不是关于反向如何确定要使用哪个命名空间,而是这是为同一应用程序使用两个命名空间的适当方法吗?这是我应该采取完全不同的方式吗?
到目前为止,我的大部分研究都没有取得太大成功,所以我认为这可能从根本上来说是错误的方法。
如果这种方法没问题,那么我很好奇为什么反向在它返回的命名空间中不一致。
最佳答案
关于 reversing namespaced URLs 的文档向您展示会发生什么。在您的例子中,您将同一个应用程序实例化两次,一次使用实例命名空间 api
,一次使用实例命名空间 beta
。
您的应用程序命名空间是 api_app
,由包含的 urls.py 文件中的 app_name
变量定义。因此它与两个实例命名空间中的任何一个都不匹配,这意味着没有默认的应用程序实例。
因此,在您的情况下,URL 解析器将主要解析为情况 4:如果您未在 View 中指定 current_app
,它将解析为最后一个部署的实例(意味着最后一个注册的实例) ),这是“测试版”。
您应该在 View 中指定您的 current_app
,无论是在使用 reverse
时还是在 request
对象上(以便您的模板也可以解析正确)。
关于Django 将reverse()与包含相同应用程序的多个URL一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53547162/