能否在Odoo表单中绑定Grid至多表?含订单与订单行场景
在Odoo表单中实现跨多表Grid展示与编辑
可以实现同一Grid展示并编辑Order和OrderLine关联数据的需求,核心思路是利用Odoo的模型关联特性结合视图配置或自定义组件来完成,以下是两种可行方案:
方案1:通过关联字段与Tree视图实现(原生方案)
利用Order与OrderLine的一对多关联关系,通过在视图中嵌套关联字段或添加关联字段的related属性,实现扁平或嵌套式的跨表展示与编辑。
步骤1:确保模型关联正确
在Order模型中确认已定义与OrderLine的一对多关联:
from odoo import models, fields class Order(models.Model): _name = 'order' _description = '订单' name = fields.Char('订单编号', required=True) date_order = fields.Datetime('订单日期') partner_id = fields.Many2one('res.partner', '客户') order_line = fields.One2many('order.line', 'order_id', '订单行') class OrderLine(models.Model): _name = 'order.line' _description = '订单行' order_id = fields.Many2one('order', '所属订单', required=True) product_id = fields.Many2one('product.product', '产品') product_uom_qty = fields.Float('数量') price_unit = fields.Float('单价')
步骤2:配置Tree视图
如果需要扁平展示订单行+订单信息,可在OrderLine模型中添加关联订单字段的related属性,然后基于OrderLine配置Tree视图:
# 在OrderLine模型中添加关联字段 order_name = fields.Char(related='order_id.name', string='订单编号', readonly=False) order_date = fields.Datetime(related='order_id.date_order', string='订单日期', readonly=False) partner_id = fields.Many2one(related='order_id.partner_id', string='客户', readonly=False)
对应的Tree视图配置:
<record id="view_order_line_tree_with_order" model="ir.ui.view"> <field name="name">order.line.tree.with.order</field> <field name="model">order.line</field> <field name="arch" type="xml"> <tree editable="bottom"> <field name="order_name"/> <field name="order_date"/> <field name="partner_id"/> <field name="product_id"/> <field name="product_uom_qty"/> <field name="price_unit"/> </tree> </field> </record>
这种方式下,编辑order_name等关联字段会直接同步更新对应的Order模型数据,订单行字段则直接修改OrderLine,保存时Odoo会自动处理事务一致性。
如果需要嵌套式展示(订单行作为订单的子列表),可直接在Order的Tree视图中嵌套One2many字段:
<record id="view_order_tree_with_lines" model="ir.ui.view"> <field name="name">order.tree.with.lines</field> <field name="model">order</field> <field name="arch" type="xml"> <tree editable="bottom"> <field name="name"/> <field name="date_order"/> <field name="partner_id"/> <field name="order_line" widget="one2many_list"> <tree editable="bottom"> <field name="product_id"/> <field name="product_uom_qty"/> <field name="price_unit"/> </tree> </field> </tree> </field> </record>
方案2:自定义JavaScript组件(复杂场景)
如果原生Tree视图无法满足特殊布局或交互需求,可开发自定义JS组件继承Odoo的ListRenderer和ListController,实现跨模型数据的加载、展示与编辑:
- 在组件中同时请求Order和OrderLine的数据,合并为统一的数据集;
- 渲染自定义Grid布局,区分订单与订单行数据;
- 编辑时判断修改的是订单还是订单行字段,分别调用对应模型的
write方法保存; - 处理事务回滚逻辑,确保跨模型修改的一致性。
关键注意事项
- 权限控制:确保用户同时拥有Order和OrderLine模型的编辑权限;
- 性能优化:数据量较大时需添加分页、过滤逻辑,避免全量加载导致卡顿;
- 数据一致性:跨模型编辑时依赖Odoo的事务机制,避免手动拆分保存操作。
内容的提问来源于stack exchange,提问作者Jek
相关产品推荐
相关产品推荐

