使用自定义 url_path 在 @list_route 上反向

2024-03-24

如果我有一个包含以下代码的视图集:

class ExtraRouteViewset(viewsets.GenericViewSet):
    @list_route(methods=['get'])
    def somefunction(self, request):
        return Response({
            'key': 'value',
            'reverse': reverse('extraroute-somefunction'),
        })

    @list_route(methods=['get'], url_path='arguments/(?P<thing>[^/]+)')
    def arguments(self, request, thing):
        return Response({
            'key': thing,
            'reverse': reverse('extraroute-arguments', kwargs={'thing': 'something'}),
        })

我希望这两种方法都能起作用。然而,第二个reverse提出一个NoReverseMatch。检查 url 模式(通过导航到不存在的 url)显示以下 url 模式:

^demo/ ^ ^extraroute/arguments/(?P<thing>[^/]+)/$ [name='extraroute-arguments/(?P<thing>[^/]+)']
^demo/ ^ ^extraroute/arguments/(?P<thing>[^/]+)/\.(?P<format>[a-z0-9]+)$ [name='extraroute-arguments/(?P<thing>[^/]+)']
^demo/ ^ ^extraroute/somefunction/$ [name='extraroute-somefunction']
^demo/ ^ ^extraroute/somefunction/\.(?P<format>[a-z0-9]+)$ [name='extraroute-somefunction']

视图名称似乎是extraroute-arguments/(?P<thing>[^/]+)代替extraroute-arguments?事实上,如果我使用reverse('extraroute-arguments/(?P<thing>[^/]+)', kwargs={'thing': 'something'})有用。我是否在这里遗漏了一些非常明显的东西,或者这是一个错误django-rest-framework?

这是使用 Django 1.8a 和 django-rest-framework 3.0.5。


那么,在第二个示例中,您发送url_path='arguments/(?P<thing>[^/]+)'。 Django REST 框架use it https://github.com/tomchristie/django-rest-framework/blob/5688d8b73648c67fbe5ea003916dae04a7c5bba0/rest_framework/routers.py#L168创建一个URL pattern and a URL Name. But 实施 https://github.com/tomchristie/django-rest-framework/blob/5688d8b73648c67fbe5ea003916dae04a7c5bba0/rest_framework/routers.py#L35太纯粹,无法删除正则表达式。

使用自定义路由器的解决方案

#inside urls.py
router = SimpleRouter()
router.routes.append(
    Route(
        url=r'^{prefix}/arguments/(?P<thing>[^/]+)$',
        name='{basename}-arguments',
        mapping={
            'get': 'arguments',
        },
        initkwargs={}
    ),
)
router.register('extraroute', ExtraRouteViewset, base_name='extraroute')
urlpatterns = router.urls

然后在views.py中删除@list_route装饰器,因为不再需要它(并且会导致路线冲突)

#inside views.py
class ExtraRouteViewset(viewsets.GenericViewSet):
    #...

    def arguments(self, request, thing):
        return Response({
            'key': thing,
            'reverse': reverse('extraroute-arguments', kwargs={'thing': 'something'}),
        })

我不得不提的是,这实际上添加了一个硬编码Route默认内的模式SimpleRouter (具有列表、创建、检索、更新、部分更新、销毁模式)。这意味着every通过此路由器实例注册的视图集将能够实现arguments方法,当正则表达式匹配它时,将调用该方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用自定义 url_path 在 @list_route 上反向 的相关文章

随机推荐

  • 实时 git diff

    我通常喜欢在查看 git diff 的同时输入 git commit 消息 我非常喜欢所产生的输出这个 git 的 Perl 小插件 https github com git git tree master contrib diff hig
  • 从文本文件读取直到 EOF 重复最后一行[重复]

    这个问题在这里已经有答案了 下列C 代码使用ifstream对象从文本文件 每行一个数字 读取整数 直到它命中EOF 为什么它会读取最后一行的整数两次 如何解决这个问题 Code include
  • 使用 Linq 进行数学统计

    我有一个收藏person对象 IEnumerable 每个人都有一个age财产 我想生成该年龄属性的集合统计信息 例如最大值 最小值 平均值 中值等 使用 LINQ 执行此操作最优雅的方法是什么 这是 Median 的完整通用实现 它可以正
  • 混合 C++/CLI TypeLoadException 内部限制:字段过多

    为了将一些新的 UI 迁移到托管 C 领域 我最近在一个大型旧项目上启用了公共语言运行时支持 clr 该项目在共享 DLL 中使用 MFC 并依赖于我们的大约十几个其他项目 整体解决方案 该项目是我们应用程序的核心 并将驱动生成的任何托管
  • Android 避免 OnResume

    我有 3 个基于 Activity 的应用程序 其工作流程如下MainActivity ListView and DetailView 当onResume事件触发时 需要调用MainActivity 不去其他两项活动 有什么办法可以打电话吗
  • 如何修复 npm WARN 配置全局 `--global`、`--local` 已弃用。使用 `--location=global` 代替

    你如何解决这个问题 Nodejs npm 和 npx 问题 https i stack imgur com 0D9Qv png 当我尝试在命令提示符下安装或检查任何内容时 Node js通过 npm WARN 配置全局 global loc
  • R - 如何确定一周结束日期

    可以说我有以下数据框 df lt structure data frame date c 2014 11 04 2014 11 12 2014 11 17 volume c 5 10 2 这将返回 date volume 2014 11 0
  • wix 主要升级未安装所有文件

    我有一个非常简单的 WiX 项目 版本 3 7 它安装一些文件 NET 程序版本 6 0 0 0 我准备使用 WiX 中的 MajorUpgrade 功能发布新版本 6 0 1 0 我在 Product 元素中保持 UpgradeCode
  • 爪哇。实现侦听器的正确模式

    我经常遇到的情况是 给定的对象需要有许多侦听器 例如 我可能有 class Elephant public void addListener ElephantListener listener 但我会遇到很多这样的情况 也就是说 我也会有一
  • ClientScript.RegisterStartupScript()

    ClientScript RegisterStartupScript 和 ClientScript RegisterClientScriptBlock 有什么区别 ClientScript RegisterStartupScript 用于传
  • groovy 执行时参数包含空格

    如何向 groovy 中字符串的执行方法提供包含空格的参数 仅仅像在 shell 中那样添加空格并没有帮助 println ls tmp folder with spaces execute text 这会给 ls 调用带来三个错误的参数
  • 如何从这些输出中获取实际的函数名称

    我使用 boost 测试进行单元测试 使用 gcov 和 lcov 来测量覆盖范围 不幸的是 genhtml 生成类似函数覆盖率的报告 我现在想知道有什么功能 ZN7UtilLib11ProgressBarC2EjdRSo实际上是 到目前为
  • java.lang.SecurityException:需要 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限

    我正在开发一个 android 我想使用 NETWORK PROVIDER 获取用户位置 我没有使用 GPS 来实现此目的 我收到以下异常 java lang SecurityException 需要 ACCESS FINE LOCATIO
  • 从 void* 到 char** 的转换无效

    自从我搞乱 C 代码以来已经有一段时间了 在 Ubuntu 下使用 gcc 编译 C 代码时出现以下错误 我用来编译代码的命令是 如果这些错误是由于我使用的编译器造成的 请让我知道如何消除该错误 gcc o runnable mycode
  • C 中的 sizeof(array):分段错误 [重复]

    这个问题在这里已经有答案了 嗨 我从这段代码中得到了一个奇怪的分段错误 int main void int array1 10000000 int n sizeof array1 printf d n n return 0 但是如果我改变
  • 数据绑定编译器错误:“无法解析 SafeVarargs 的类型”

    我已经尝试让 Android 数据绑定正常工作两天了 编译器问题接二连三地出现 现在我完全碰壁了 我用谷歌搜索了这个 但没有找到任何东西 这是完整的日志 java lang RuntimeException failure see logs
  • Visual Studio 2015 调用堆栈显示

    最近在我的计算机上全新安装了 Windows 10 Pro 后 我注意到每当我中断程序并打开调用堆栈时 调用堆栈都会显示应用程序名称和行号 但函数名称显示为
  • 寻找 2 个以上整数的 GCD(最大公约数)?

    我已经有一个函数可以找到 2 个数字的 GCD function getGCDBetween a b while b 0 m a b a b b m return a 但现在 我想扩展这个函数来找到 N 点的 GCD 有什么建议吗 有一种更
  • 概述 div 和图像

    我正在开发我的作品集网站 但遇到了问题 一旦我想要多层 你必须看到才能理解这一点 它们的排列完全不同 我对图像使用了相同的像素大小 重要提示 我只能对图像和内容周围的 div 使用像素 因为我需要使用 media 来更改我手机的页面 所以我
  • 使用自定义 url_path 在 @list_route 上反向

    如果我有一个包含以下代码的视图集 class ExtraRouteViewset viewsets GenericViewSet list route methods get def somefunction self request re