You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 17:14:42