如何让Django的URL路由接受不带pk参数的/tracks路径?
解决Django路由同时匹配带pk和不带pk路径的方法
有几种实用的方式可以实现需求,你可以根据场景选择:
方法一:拆分两个独立路由(推荐)
直接定义两个路由指向同一个视图函数,逻辑清晰、后期维护方便:
# urls.py path('tracks/', views.tracks, name='tracks_list'), path('tracks/<int:pk>/', views.tracks, name='tracks_detail'),
然后在视图函数里给pk参数设置默认值,区分两种请求逻辑:
# views.py def tracks(request, pk=None): if pk is not None: # 处理单条track的详情逻辑,比如按pk查询数据 track = get_object_or_404(Track, pk=pk) # 后续业务代码... else: # 处理track列表逻辑,比如查询全部数据 tracks = Track.objects.all() # 后续业务代码...
方法二:使用可选路径参数
Django 2.0+支持在路径参数后加?标记为可选,单个路由即可匹配两种情况:
# urls.py path('tracks/<int:pk>?/', views.tracks, name='tracks'),
视图函数同样需要给pk设置默认值None,逻辑和方法一一致。
方法三:使用正则路由(re_path)
通过正则表达式匹配两种路径格式,灵活性更高:
# urls.py from django.urls import re_path re_path(r'^tracks/(?:(?P<pk>\d+)/)?$', views.tracks, name='tracks'),
正则表达式的含义是:tracks/后可跟随数字格式的pk参数加斜杠,也可直接结束;(?:...)为非捕获分组,不影响参数传递。视图函数依旧按pk=None的逻辑处理。
小提示
如果选择拆分路由的方式,建议给两个路由设置不同的name(比如tracks_list和tracks_detail),后续模板或反向解析时更明确,不易出错。
内容的提问来源于stack exchange,提问作者whitebear
相关产品推荐
相关产品推荐

