Django模板URL反向解析失败:projectid变量传递异常排查
嘿,我碰到过几乎一模一样的问题,这大概率是你用{% include %}引入按钮模板时,没把projectid变量传递给子模板导致的!
问题根源
Django的include标签默认不会自动将父模板的上下文变量传递给子模板。虽然你在父模板里用{{ projectid }}能正常显示数值1,但被include进来的子模板(也就是放表单按钮的那个模板)根本没拿到这个变量,所以在URL反向解析时,projectid实际是空字符串,才会出现这个错误:
Reverse for 'p4_descriptor_update' with arguments '('', 249)' not found. 2 pattern(s) tried
快速解决方案
找到你引入子模板的代码,修改成明确传递projectid的形式:
{% include '你的子模板路径.html' with projectid=projectid %}
把你的子模板路径.html替换成你实际的模板文件路径(比如szenario/p4_update_button.html这类)。
验证方法
在子模板里临时加一行{{ projectid }},刷新页面后如果能正常显示1,说明变量已经传递成功,此时再测试表单的URL反向解析就会正常工作了。
进阶优化(可选)
如果子模板只需要projectid这一个变量,或者想避免父模板的其他上下文变量意外泄露到子模板,可以加上only关键字:
{% include '你的子模板路径.html' with projectid=projectid only %}
这样子模板就只能访问你指定的projectid变量,更符合上下文隔离的最佳实践。
额外确认
再检查一下你的视图代码,确认projectid确实被正确放进了context里(你已经提到父模板能显示,这一步应该没问题),以及urls.py里的参数顺序id→pk和你URL反向解析时的参数顺序projectid→form.instance.pk是一致的,这两点都没问题的话,修改include的变量传递后就能解决问题啦。
内容的提问来源于stack exchange,提问作者Rubick

