Django模板调用{% url %}反向解析edit-todo时参数匹配失败如何解决?
问题根源
报错触发的核心原因是模板执行{% url %}反向路由解析时,你传入的参数tododetail.todo.id为空值,和路由要求的int类型pk参数规则不匹配,所以解析失败。
排查&解决步骤
- 第一步:先校验传入参数是否真的为空
在模板对应位置先插入{{ tododetail.todo.id }},渲染页面后查看该位置输出,如果为空说明你传递给模板的上下文数据有问题。
优先排查两个点:- 渲染该模板的视图函数是否正确将
tododetail对象传入了模板上下文 - 是否存在部分
tododetail关联的Todo对象已被删除,导致外键关联失效,tododetail.todo为None的情况
- 渲染该模板的视图函数是否正确将
- 第二步:优化参数取值写法
Django外键关联默认会生成带_id后缀的直接字段,你可以替换为{% url 'core:edit-todo' tododetail.todo_id %}取值,这种写法不会因为关联的Todo对象为空时抛出属性异常,只会返回None,更容易定位问题。 - 第三步:排查路由命名冲突
注意到你的报错信息里路由正则匹配的参数名是id,但你贴出的urls.py里路由定义的参数是pk,大概率存在命名空间重复的问题:有其他同名edit-todo的路由覆盖了你当前app下的路由定义,可以先去掉命名空间尝试{% url 'edit-todo' 1 %}写死参数测试,确认是否能正常解析,如果可以说明你绑定的core命名空间对应的路由不是你贴出的这段配置。 - 临时兜底方案
可以给参数加默认值避免页面直接报错:{% url 'core:edit-todo' tododetail.todo.id|default:1 %},等定位到空值原因后再删除兜底逻辑即可。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

