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。 我的预期行为是什么:
但是,当我输入 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 模式的顺序,将最后一个 <uuid:application>
模式保留在第二个数字上。
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 中的参数类型的目的是什么?编辑:将str
,则需要重新排列URL顺序。你能验证这个答案吗?通过将str
更改为slug
为您解决了,但这不是偶像解决方案。以上是关于Django 2+ 中的多个可选 URL 参数的主要内容,如果未能解决你的问题,请参考以下文章