升级Django至2.1.9后后台内联模型报JS错误求助
Django 2.1.9 后台内联模型JS错误:"Cannot read property 'prefix' of undefined" 排查与修复
这个问题我之前帮同行排查过类似的,核心原因就是Django 1.9到2.x版本间,admin内联表单的JS初始化逻辑发生了参数顺序的变更,导致你的自定义JS代码(或第三方扩展代码)的调用方式不再适配新版本。
问题根源拆解
在Django 1.9的inlines.js中,tabularFormset函数的参数定义相对宽松,甚至允许直接传入options对象作为唯一参数;但升级到2.1.9后,这个函数的参数被明确规定为:
function tabularFormset(selector, options) { // ... 内部逻辑依赖options.prefix }
如果你的代码还是沿用旧版本的调用方式(比如直接传{prefix: 'xxx'}而不传selector),就会出现:
- 第一个参数
selector被赋值为你传入的options对象 - 第二个参数
options则变成undefined
这就直接导致函数内部尝试读取options.prefix时抛出"Cannot read property 'prefix' of undefined"的错误。
具体修复步骤
定位自定义/第三方调用代码
先在项目代码中搜索tabularFormset的调用位置,可能是你自己编写的admin自定义脚本,或者是第三方admin扩展插件的JS文件。修正参数传递顺序
将原来的错误调用:// 错误:只传了options,没有传selector tabularFormset({prefix: 'my-inline-model-prefix'});修改为符合新版本规范的调用,第一个参数传入内联表单的容器选择器(通常是
'div.inline-group',或者你自定义的选择器),第二个参数传入包含prefix的options对象:// 正确:先传selector,再传options tabularFormset('div.inline-group', {prefix: 'my-inline-model-prefix'});检查第三方依赖适配性
如果是第三方admin扩展导致的问题,先查看该扩展是否有适配Django 2.x的版本,优先升级插件;如果没有,就需要修改插件内部的JS调用逻辑,按照上述方式修正参数顺序。
验证修复效果
修改完成后,刷新admin内联模型页面,打开浏览器控制台(F12)查看是否还有JS报错,同时测试内联模型的添加、删除等功能是否正常工作。
内容的提问来源于stack exchange,提问作者pjanecze
相关产品推荐
相关产品推荐

