Django 2 +

时间:2018-08-08 15:32:31

标签: django django-urls django-2.0

我正在尝试在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”是我的。 我的预期行为

  • 当用户输入 / ABC12 时:视图的kwargs状态和应用程序为“无”,为 ABC12
  • 当用户输入 / ABC12 / new 时:视图的kwargs状态为“ ”,应用为“无”,则为 ABC12
  • >
  • 当用户输入 / ABC12 / new / 6eba5dbf-220b-4913-a359-f93fab3153d1 时:视图的kwargs状态为“ new ”,而应用程序kwarg为“ 6eba5dbf-220b-4913-a359-f93fab3153d1 ”,子弹为 ABC12
  • 当用户输入 / ABC12 / 6eba5dbf-220b-4913-a359-f93fab3153d1 时:视图的kwargs状态为,应用程序kwarg为“ 6eba5dbf-220b- 4913-a359-f93fab3153d1 ”,子弹为 ABC12

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

wargs是:

  

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

(我希望不会有kwarg状态,“ application” kwarg应该是“ 6eba5dbf-220b-4913-a359-f93fab3153d1”)。

我该如何实现?我不想以多种观点告终。

1 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为'6eba5dbf-220b-4913-a359-f93fab3153d1'这个uuid符合您的网址的第二种格式,即

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 -匹配任何非空字符串,但路径分隔符“ /”除外。   如果表达式中未包含转换器,则为默认设置。

因此,如果您的网址格式与arg类型不同,那么如果您愿意解析uuid,则应将其保留在str模式的上方

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

  

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

Read the docs