如何正确继承Odoo Studio创建的自定义视图
原方案失效原因
直接继承Studio自动生成的自定义视图、靠随机生成的studio_page_*属性做xpath定位的方案本身存在稳定性缺陷,初期能用只是还没触发Studio的内容重生成逻辑:
- Studio生成的视图XML ID带随机UUID后缀,只要对对应视图做过重置、重新生成、跨环境迁移、模块升级操作,这个ID就会变化,直接导致
inherit_id找不到父视图抛出加载错误 - xpath定位用的
studio_page_6zNV9这类name是Studio自动生成的随机串,只要在Studio里调整过对应页面、删除重建,这个name就会变化,直接导致xpath匹配不到节点抛出错误
可行替代方案
方案1:直接继承Odoo原生基础视图,完全不依赖Studio生成的中间视图
这是稳定性最高的方案,彻底绕开Studio随机生成内容的影响:
- 定位
res.partner对应的官方原生基础表单视图(默认XML ID为base.view_partner_form),直接将自定义模块的继承目标设置为这个原生视图 - xpath不要定位Studio生成的随机节点,直接定位原生视图里固定存在的节点(比如原生page、group的固定name属性),将财务信息页插入到目标位置即可
- 参考实现代码:
<?xml version="1.0" encoding="UTF-8"?> <odoo> <record id="view_res_partner_finan" model="ir.ui.view"> <field name="name">res.partner.finan</field> <field name="model">res.partner</field> <!-- 直接继承Odoo原生合作伙伴表单视图,不引用Studio生成的带随机ID的视图 --> <field name="inherit_id" ref="base.view_partner_form"/> <field name="arch" type="xml"> <!-- 定位原生视图固定节点,比如在notebook最后一个页面后追加自定义页 --> <xpath expr="//form/sheet/notebook/page[last()]" position="after"> <page name="financ" string="Inf. Financiera"> <group> <!-- 自定义字段与布局内容 --> </group> </page> </xpath> </field> </record> </odoo>
- 代码部署升级完成后,可以删掉Studio里之前生成的对应重复自定义页,避免页面重复显示。
方案2:保留Studio已有自定义配置,手动固定不稳定标识
如果不想放弃Studio已经做好的其他配置,就把所有随机生成的标识改成固定值,消除变量:
- 进入Studio打开对应视图,找到之前要替换的
studio_page_6zNV9页面,手动将它的name属性改成固定自定义值(比如studio_page_finance_anchor),不要使用自动生成的随机串 - 确认当前环境下Studio对应自定义视图的稳定XML ID,不要使用带随机UUID的临时ID,可以通过导出Studio自定义包、或者在
ir.ui.view模型中搜索对应视图名称的方式拿到正确引用ID - 修改完成后,继承代码里的
inherit_id和xpath都使用手动设置的固定值,后续不在Studio中随意删除该锚点页面,即可保持稳定。
方案3:调整视图优先级做兼容兜底
如果涉及多环境迁移等复杂场景,可以给自定义视图添加priority字段,值设置为比Studio视图优先级更高(Odoo中视图优先级数字越大越晚加载,Studio视图默认优先级为16,自定义视图可以设置为25及以上),同时xpath不要强依赖Studio生成的节点,直接以notebook等固定节点为锚点做操作,就算Studio生成的节点变化,也不会抛出致命加载错误。
示例配置:
<field name="priority">25</field>
内容的提问来源于stack exchange,提问作者Capriatto
相关产品推荐
相关产品推荐

