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

Odoo notebook树形视图one2many字段添加状态域过滤失效问题

问题原因

直接在XML视图中给同一One2many字段多次配置domain不生效,是Odoo的固有机制限制:

  • 同一个模型字段在单张表单视图中被多次引用时,只有第一次加载的字段配置会被识别,后续同名字段的domain、上下文等配置全部会被忽略
  • One2many字段标签上直接配置的domain,作用是限制创建/关联时的可选记录范围,不是对已关联的存量数据做前端展示过滤,根本无法实现同关联数据集分条件分页展示的需求。
实现方案

兼容性最好、逻辑最稳定的实现方式是在stock.trip模型中新增两个带过滤逻辑的计算型One2many字段,分别对应两个页签的展示规则,再调整XML视图引用对应新字段即可。

第一步:修改stock.trip模型代码

在原有模型基础上新增两个计算字段,分别过滤已注册、未注册的扫描记录,原有trip_scanned字段保留用于后台业务逻辑处理:

class StockTrip(models.Model):
    _name = 'stock.trip'
    _description = 'Trip'
    _rec_name = 'kode_trip'
    _order = "id desc"

    trip_scanned = fields.One2many('stock.trip.sn.scanned', 'trip_id')
    # 分页展示用的过滤字段
    trip_scanned_registered = fields.One2many(
        'stock.trip.sn.scanned', 
        'trip_id', 
        string='已注册扫描记录',
        compute='_compute_filtered_trip_scanned'
    )
    trip_scanned_unregistered = fields.One2many(
        'stock.trip.sn.scanned', 
        'trip_id', 
        string='未注册扫描记录',
        compute='_compute_filtered_trip_scanned'
    )

    def _compute_filtered_trip_scanned(self):
        for record in self:
            # 已注册规则:new_register值为old
            record.trip_scanned_registered = record.trip_scanned.filtered(
                lambda line: line.new_register == 'old'
            )
            # 未注册规则:state_reception值为unregistered
            record.trip_scanned_unregistered = record.trip_scanned.filtered(
                lambda line: line.state_reception == 'unregistered'
            )

第二步:调整XML视图代码

将两个页签内引用的字段替换为新增的过滤字段,移除原来写在field标签、tree内字段标签上的无效domain配置:

<notebook>
    <page string="Scan barcode">
        <field name="trip_scanned_registered">
            <tree create="false" edit="false">
                <field name="number_index" string="No"/>
                <field name="lot_id" string="QR Code"/>
                <field name="sn_vendor" string="SN Vendor"/>
                <field name="product_id" string="Product"/>
                <field name="picking_id" string="DO"/>
                <field name="partner_name" string="Pelanggan"/>
                <field name="state_reception" string="Status"/>
                <field name="new_register" string="Status Register"/>
            </tree>
        </field>
    </page>
    <page string="SN Belum Teregistrasi">
        <field name="trip_scanned_unregistered">
            <tree create="false">
                <field name="number_index" string="No"/>
                <field name="qr_input"/>
                <field name="sn_vendor" string="SN Vendor"/>
                <field name="product_id" string="Product"/>
                <field name="picking_id" string="DO"/>
                <field name="partner_name" string="Pelanggan"/>
                <field name="state_reception" string="Status" />
                <field name="new_register" string="Status Register"/>
            </tree>
        </field>
    </page>
</notebook>
补充说明
  • 无需修改stock.trip.sn.scanned模型的原有代码
  • 计算字段会在主记录加载、关联扫描记录新增/修改/删除时自动刷新过滤结果,分页切换不会出现数据串扰
  • 原代码中写在tree视图内字段标签上的domain,作用是限制该字段下拉选择的可选值范围,和列表行数据过滤无关,属于无效配置,直接删除即可

内容的提问来源于stack exchange,提问作者Admaja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:36:44