Django路由配置错误:访问add_interest触发兴趣详情DoesNotExist异常
问题根源
Django的URL路由匹配规则为按代码书写顺序从上到下逐行检索,命中第一条匹配规则即停止匹配。
你当前的路由配置顺序存在优先级冲突:将带动态slug参数的兴趣详情路由,配置在了静态路径的新增兴趣路由之前。当你访问/genres/[分类slug]/add_interest/路径时,Django会优先匹配到动态详情路由,把路径中的add_interest直接识别为interest_name参数,分发请求到interest视图,完全不会走到后面定义的add_interest逻辑。
之后interest视图用值为add_interest的slug查询Interest表,无法匹配到对应记录,最终抛出Interest matching query does not exist的异常。
修复步骤
- 调整urls.py的路由书写顺序,将固定路径的add_interest路由移到动态slug匹配的兴趣详情路由之前,保证静态路径优先命中。调整后的参考配置:
path('genres/<slug:genre_name>/add_interest/', views.add_interest, name='add_interest'), path('genres/<slug:genre_name>/<slug:interest_name>/', views.interest, name='interest'),
- 修正原配置中的语法错误:原路由里
name='interest’的收尾引号是中文右单引号,会引发路由解析异常,需替换为标准英文单引号。 - 可选优化:给interest视图里的
Genre.objects.get()、Interest.objects.get()查询逻辑补充异常捕获,查询不到对应记录时返回404页面,避免非法访问触发500错误。
内容的提问来源于stack exchange,提问作者Van Yang
相关产品推荐
相关产品推荐

