Django 2+ 中的多个可选 URL 参数

Posted

技术标签:

【中文标题】Django 2+ 中的多个可选 URL 参数【英文标题】:Multiple optional URL arguments in Django 2+ 【发布时间】:2019-01-15 22:40:34 【问题描述】:

我正在尝试在我的 django 2+ 应用程序中实现指向一个基于类的视图的多个 URL 模式。

我的网址:

path('<slug:slug>', views.OfferDetailView.as_view(), name='show'),
path('<slug:slug>/<str:status>', views.OfferDetailView.as_view(), name='show'),
path('<slug:slug>/<str:status>/<uuid:application>', views.OfferDetailView.as_view(), name='show'),
path('<slug:slug>/<uuid:application>', views.OfferDetailView.as_view(), name='show'),

假设“ABC12”是我的 slug。 我的预期行为是什么

当用户进入 /ABC12 时:view 的 kwargs 状态和 application 是 Nones,slug 是 ABC12 当用户进入 /ABC12/new 时:view 的 kwargs 状态为“new”,application 为 None,slug 为 ABC12 当用户进入 /ABC12/new/6eba5dbf-220b-4913-a359-f93fab3153d1 时:视图的 kwargs 状态为“new”,应用程序 kwarg 为“ 6eba5dbf-220b-4913-a359-f93fab3153d1", slug 是 ABC12 当用户进入/ABC12/6eba5dbf-220b-4913-a359-f93fab3153d1时:视图的kwargs状态为None,应用kwarg为“6eba5dbf-220b- 4913-a359-f93fab3153d1", slug 是 ABC12

但是,当我输入 url 时: /ABC12/6eba5dbf-220b-4913-a359-f93fab3153d1

kwarg 是:

'slug': 'ABC12', 'status': '6eba5dbf-220b-4913-a359-f93fab3153d1'

(我预计不应该有 status kwarg,'application' kwarg 应该是“6eba5dbf-220b-4913-a359-f93fab3153d1”)。

我怎样才能做到这一点?我不想以多个视图结束。

【问题讨论】:

【参考方案1】:

这是因为'6eba5dbf-220b-4913-a359-f93fab3153d1' uuid 满足您的 URL 的第二种模式,即

path('<slug:slug>/<str:status>', views.OfferDetailView.as_view(), name='show'),

您可以做的一件事是重新排列 URL 模式的顺序,将最后一个 &lt;uuid:application&gt; 模式保留在第二个数字上。

path('<slug:slug>', views.OfferDetailView.as_view(), name='show1'),
# keep this here
path('<slug:slug>/<uuid:application>', views.OfferDetailView.as_view(), name='show2'),
path('<slug:slug>/<str:status>', views.OfferDetailView.as_view(), name='show3'),
path('<slug:slug>/<str:status>/<uuid:application>', views.OfferDetailView.as_view(), name='show4'),

网址格式也不要使用相同的名称

更新

str - 匹配任何非空字符串,不包括路径分隔符“/”。 如果表达式中不包含转换器,则这是默认设置。

因此,如果您愿意解析 uuid,则应将其保留在 str 模式之上,如果您的 URL 模式除了 arg 类型之外相似

另一方面,uuid 只会解析格式为'6eba5dbf-220b-4913-a359-f93fab3153d1' 的字符串

uuid - 匹配格式化的 UUID。防止多个 URL 映射 到同一页,必须包括破折号,字母必须是 小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。退货 一个 UUID 实例。

Read the docs

【讨论】:

为什么它满足第二个 url 模式?那么,如果它的 UUID 不是字符串,那么 url 中的参数类型的目的是什么?编辑:将 更改为 对我有用,现在一切正常 @dease 检查我的更新,如果这解决了您的问题,请告诉我 @dease 如果要保留str,则需要重新排列URL顺序。你能验证这个答案吗?通过将str 更改为slug 为您解决了,但这不是偶像解决方案。

以上是关于Django 2+ 中的多个可选 URL 参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在django中将多个参数传递给url

Laravel 4:如何传递多个可选参数

django - 可选 url 参数的正则表达式

在 Django 中处理来自 URL 的多个参数

django 注册 redux URL 受具有多个查询参数的 url 影响

django-rest-framework 如何处理多个 URL 参数?