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

能否在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,实现跨模型数据的加载、展示与编辑:

  1. 在组件中同时请求Order和OrderLine的数据,合并为统一的数据集;
  2. 渲染自定义Grid布局,区分订单与订单行数据;
  3. 编辑时判断修改的是订单还是订单行字段,分别调用对应模型的write方法保存;
  4. 处理事务回滚逻辑,确保跨模型修改的一致性。

关键注意事项

  • 权限控制:确保用户同时拥有Order和OrderLine模型的编辑权限;
  • 性能优化:数据量较大时需添加分页、过滤逻辑,避免全量加载导致卡顿;
  • 数据一致性:跨模型编辑时依赖Odoo的事务机制,避免手动拆分保存操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:30:54