Django 将reverse()与包含相同应用程序的多个URL一起使用

标签 django api reverse

编辑:我正在使用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/

相关文章:

Django DateField 不允许为 null

java - 反转 ArrayList<String>

java - 谷歌分析 V3 API : Java method to include dimension and metrics

java - 在计算日期时依赖毫秒是否安全?

jquery - jQuery 序列化有反函数吗?

python 列表反转和合并

Django 查询设置为从数据库中获取数据?

django - Django 中的自定义模型方法

python - 更新 tastypie 中多个资源的字段

facebook - 评论系统和 API 的优缺点(Disqus vs Facebook Comments vs Intense Debate vs Echo)?