如何在Odoo中为销售订单现有搜索筛选器添加搜索域并排查报错?
Odoo销售订单筛选器优化问题解答
问题背景
我给Odoo的Sales Order(销售订单)新增了title字段,希望在销售订单列表视图的搜索框中支持通过该字段搜索。目前使用position="replace"的方式可以实现需求,但代码略显冗余;尝试用position="attributes"仅替换筛选器的filter_domain时,触发了以下错误:
Caused by: InvalidDomainError: Invalid domain AST
以下是两种实现代码:
可运行但冗余的代码(replace方式)
<record id="view_sales_order_filter_inherit_sale" model="ir.ui.view"> <field name="name">sale.order.filter.toledo.sale</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_sales_order_filter" /> <field name="arch" type="xml"> <!-- <field name="name" position="attributes"> <attribute name="filter_domain"> "['|', '|',('name', 'ilike', self),('client_order_ref', 'ilike', self),'|',('partner_id', 'child_of', self),('title','ilike', self)]" </attribute> </field> --> <field name="name" position="replace"> <field name="name" string="Order" filter_domain="['|', '|',('name', 'ilike', self),('client_order_ref', 'ilike', self),'|',('partner_id', 'child_of', self),('title','ilike', self)]"/> </field> </field> </record>
报错的代码(attributes方式)
<record id="view_sales_order_filter_inherit_sale" model="ir.ui.view"> <field name="name">sale.order.filter.toledo.sale</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_sales_order_filter" /> <field name="arch" type="xml"> <field name="name" position="attributes"> <attribute name="filter_domain"> "['|', '|',('name', 'ilike', self),('client_order_ref', 'ilike', self),'|',('partner_id', 'child_of', self),('title','ilike', self)]" </attribute> </field> </field> </record>
问题分析与解决
1. 报错原因
域名本身逻辑没有问题,报错是因为使用position="attributes"修改filter_domain时,额外添加的外层双引号导致解析失败。
在replace方式中,filter_domain作为XML属性,值需要用双引号包裹;但使用attributes方式时,<attribute>标签内的内容会直接赋值给目标属性,此时再添加外层双引号,会让Odoo解析到的domain变成""['|', ...]"",外层双引号被当成了domain的一部分,从而触发无效域语法错误。
2. 能否用position="attributes"实现需求?
完全可以,只需要去掉filter_domain值外层的双引号即可。修正后的代码如下:
<record id="view_sales_order_filter_inherit_sale" model="ir.ui.view"> <field name="name">sale.order.filter.toledo.sale</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_sales_order_filter" /> <field name="arch" type="xml"> <field name="name" position="attributes"> <attribute name="filter_domain"> ['|', '|',('name', 'ilike', self),('client_order_ref', 'ilike', self),'|',('partner_id', 'child_of', self),('title','ilike', self)] </attribute> </field> </field> </record>
3. 额外验证要点
- 确认
title字段已正确添加到sale.order模型,且字段类型支持ilike搜索(如char、text类型) - 确保domain逻辑符合预期:多条件或查询,覆盖订单名称、客户订单参考、客户(含子客户)、新增的
title字段
内容的提问来源于stack exchange,提问作者MrWater
相关产品推荐
相关产品推荐

