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
相关产品推荐
相关产品推荐

