Odoo 18中如何永久显示ir.ui.view表单内inherit_children_ids字段的非活跃行
Odoo 18中如何永久显示ir.ui.view表单内inherit_children_ids字段的非活跃行
嗨,我来帮你搞定这个问题!在Odoo里,One2Many字段默认会自动隐藏active=False的非活跃记录,尤其是保存父视图之后,这是框架内置的过滤逻辑在搞鬼。你之前的自定义模块没生效,大概率是没针对性地打破这个默认规则,下面给你两种靠谱的解决方案:
方案1:通过视图继承强制显示所有关联记录
这个方案更轻量,不用修改模型,只需要重写ir.ui.view的表单视图,给inherit_children_ids字段指定一个不过滤活跃状态的domain就行:
在你的自定义模块里添加XML视图文件:
<odoo> <record id="view_ui_view_form_custom_inherit" model="ir.ui.view"> <field name="name">ir.ui.view.form.custom.inherit</field> <field name="model">ir.ui.view</field> <field name="inherit_id" ref="base.view_ui_view_form"/> <field name="arch" type="xml"> <!-- 给inherit_children_ids字段修改domain,显示所有关联记录 --> <field name="inherit_children_ids" position="attributes"> <attribute name="domain">[('id', 'in', inherit_children_ids.ids)]</attribute> </field> </field> </record> </odoo>
原理很简单:直接用inherit_children_ids.ids获取当前视图关联的所有子记录ID,不管它们的active状态,这样视图就会渲染所有已关联的行,包括非活跃的,保存后也不会消失。
方案2:从模型层面重写字段,移除默认过滤
如果希望所有用到inherit_children_ids字段的地方都能显示非活跃记录,可以继承ir.ui.view模型,重写字段定义,去掉默认的active=True过滤:
在你的自定义模块的Python文件里添加:
# -*- coding: utf-8 -*- from odoo import models, fields class IrUiView(models.Model): _inherit = 'ir.ui.view' inherit_children_ids = fields.One2many( comodel_name='ir.ui.view', inverse_name='inherit_id', string='Inherited Children', domain=[], # 显式指定空domain,移除默认的active过滤 auto_join=True )
这样修改后,该字段在任何视图里都会加载所有关联的子记录,不管活跃状态。
小提醒
- 不管用哪种方案,都要确保你的自定义模块在
__manifest__.py里声明依赖base模块,保证加载顺序正确; - 修改完成后,记得升级你的自定义模块,并且清除浏览器缓存——Odoo经常会缓存旧视图导致修改不生效;
- 测试的时候,先标记一条子视图为非活跃,保存父视图后检查是否还能看到这条记录。
备注:内容来源于stack exchange,提问作者Ahrimann Steiner
相关产品推荐
相关产品推荐

