我正在尝试在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
”是我的。 我的预期行为:
但是,当我键入url时: / ABC12 / 6eba5dbf-220b-4913-a359-f93fab3153d1
wargs是:
{'slug':'ABC12','status':'6eba5dbf-220b-4913-a359-f93fab3153d1'}
(我希望不会有kwarg状态,“ application” kwarg应该是“ 6eba5dbf-220b-4913-a359-f93fab3153d1”)。
我该如何实现?我不想以多种观点告终。
答案 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实例。