【问题标题】:Multiple optional URL arguments in Django 2+Django 2+ 中的多个可选 URL 参数
【发布时间】: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”)。

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

【问题讨论】:

    标签: django django-urls django-2.0


    【解决方案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 为您解决了,但这不是偶像解决方案。
    猜你喜欢
    • 2015-03-23
    • 2012-12-30
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2019-03-11
    相关资源
    最近更新 更多