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

Odoo如何在销售订单新标签页中添加可编辑树视图?

解决Odoo销售订单标签页可编辑树视图显示异常的问题

嘿,我一眼就看出问题所在了——你误解了Odoo表单视图里嵌套树视图的逻辑,直接上解决方案和原因:

问题根源

你直接在销售订单的表单视图里嵌套了<tree>标签,还放了sale.order自身的字段。但Odoo里的树视图本质是用来展示关联记录集合的(比如one2many/many2many关系),不是用来渲染当前单条记录的字段。你这么写,Odoo会默认把tree里的内容当成表单的普通字段组渲染,自然就显示成表单样式了。

正确修正步骤

1. 先创建佣金子模型(必须)

因为佣金数据应该是销售订单的子记录(一个订单可能对应多个销售员佣金),所以先在Python文件里定义子模型:

from odoo import models, fields, api

class SaleOrderCommission(models.Model):
    _name = 'sale.order.commission'
    _description = 'Salesman Commission'

    # 关联到销售订单
    sale_order_id = fields.Many2one('sale.order', string='Sale Order', required=True, ondelete='cascade')
    user_select = fields.Many2one('res.users', string='Salesman')
    sales_value = fields.Float(string='Sales Value')
    sale_percent = fields.Float(string='Commission Percent')
    # 用compute替代on_change,Odoo新版本已不推荐on_change
    sale_commission = fields.Float(string='Commission Amount', compute='_compute_commission', store=True)

    @api.depends('sales_value', 'sale_percent')
    def _compute_commission(self):
        for rec in self:
            rec.sale_commission = rec.sales_value * (rec.sale_percent / 100)

2. 在销售订单模型里加One2many关联字段

同样在Python文件里,继承sale.order添加关联字段:

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    commission_ids = fields.One2many('sale.order.commission', 'sale_order_id', string='Salesman Commissions')

3. 修改XML视图,正确引用关联字段

现在把你的XML改成这样,通过one2many字段来渲染可编辑树视图:

<!-- 先定义子模型的可编辑树视图(可选,也可以直接嵌套在field标签里) -->
<record model="ir.ui.view" id="sale_order_commission_tree_view">
    <field name="name">sale.order.commission.tree</field>
    <field name="model">sale.order.commission</field>
    <field name="type">tree</field>
    <field name="arch" type="xml">
        <tree editable="bottom">
            <field name="user_select"/>
            <field name="sales_value"/>
            <field name="sale_percent"/>
            <field name="sale_commission" readonly="1"/>
        </tree>
    </field>
</record>

<!-- 继承销售订单表单,添加新标签页 -->
<record model="ir.ui.view" id="contract_custom">
    <field name="name">sale.order.custom.form.inherited</field>
    <field name="model">sale.order</field>
    <field name="inherit_id" ref="sale.view_order_form"/>
    <field name="arch" type="xml">
        <xpath expr="//page[@string='Other Information']" position="after">
            <page string="Salesman Commission">
                <!-- 引用one2many字段,自动渲染成树视图 -->
                <field name="commission_ids" context="{'default_sale_order_id': active_id}">
                    <!-- 这里可以直接写树视图内容,或者引用上面定义的视图ID -->
                    <tree editable="bottom">
                        <field name="user_select"/>
                        <field name="sales_value"/>
                        <field name="sale_percent"/>
                        <field name="sale_commission" readonly="1"/>
                    </tree>
                </field>
            </page>
        </xpath>
    </field>
</record>

额外说明

  • 如果你的场景是一个订单只能有一条佣金,那也得用one2many(哪怕只显示一条),因为树视图必须绑定集合类型的字段。
  • 别再用on_change了,Odoo 13之后这个机制已经被废弃,用compute + depends是标准写法,还支持后台自动计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:45:04