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

