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

如何正确继承Odoo Sale模块类并修改字段?报错求助

解决Odoo自定义销售订单模块的视图继承错误

问题拆解

你遇到的两次错误都是因为模型和视图的对应关系没处理对,咱们一步步理清楚:

第一次错误的核心原因

你一开始创建了一个全新的模型mymodule.sale.order,但却试图继承原Odoo销售订单的视图(sale.view_order_form)。原视图里的origin这类字段是属于原生sale.order模型的,你的新模型根本没定义这些字段,所以Odoo解析视图时自然会报错找不到origin。

第二次错误的问题点

你改成给sale.order加_inherit继承是走对方向了,但视图还是有两个问题:

  1. 你要替换的product_id是销售订单行(sale.order.line)里的字段,不是主订单sale.order的字段,所以在主订单视图里根本找不到这个字段,导致Odoo识别不了你要替换的目标,进而报错说自定义字段不存在(错误里的randa_product_id应该是笔误,实际是mymodule_product_id)。
  2. 视图的model属性还写着mymodule.sale.order,但用_inherit = 'sale.order'扩展原模型时,模型本质还是sale.order,不需要用新的模型名。

正确实现步骤

1. 修正Python模型代码

根据你的需求,分两种情况处理:

from odoo import models, fields

# 情况1:给主销售订单页面加自定义产品字段
class SaleOrder(models.Model):
    _inherit = 'sale.order'
    mymodule_product_id = fields.Many2one('mymodule.product', string='Products', required=True)

# 情况2:替换订单行里的原生产品字段(这才是你要替换product_id的场景)
class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'
    mymodule_product_id = fields.Many2one('mymodule.product', string='Custom Product', required=True)

2. 修正XML视图代码

对应上面两种情况,视图代码也要调整:

替换订单行的产品字段(对应情况2)

<record id="mymodule_sale_order_line_form_view" model="ir.ui.view">
    <field name="name">mymodule.sale.order.line.form.view</field>
    <field name="model">sale.order.line</field>
    <field name="inherit_id" ref="sale.view_order_line"/>
    <field name="arch" type="xml">
        <!-- 找到订单行里的原生product_id字段并替换 -->
        <field name="product_id" position="replace">
            <field name="mymodule_product_id" />
        </field>
    </field>
</record>

给主订单页面加自定义字段(对应情况1)

<record id="mymodule_sale_order_form_view" model="ir.ui.view">
    <field name="name">mymodule.sale.order.form.view</field>
    <field name="model">sale.order</field>
    <field name="inherit_id" ref="sale.view_order_form"/>
    <field name="arch" type="xml">
        <!-- 比如在订单编号后面插入自定义字段 -->
        <field name="name" position="after">
            <field name="mymodule_product_id" />
        </field>
    </field>
</record>

3. 关键注意事项

  • 模型继承的区别:_inherit = 'sale.order'是扩展原生模型,不会创建新模型;如果同时写_name = 'mymodule.sale.order'才是创建全新模型,这时候不能继承原生视图,因为新模型没有原生模型的字段。
  • 视图与模型必须匹配:视图的model属性必须和你操作的模型完全一致,继承的父视图也得是对应模型的视图。
  • 字段定位要准确:product_id属于sale.order.line,不是sale.order,别找错地方。

额外小提示

如果不需要完全替换原生product_id,只是想新增自定义产品字段,可以用position="after"或position="before"插入字段,保留原字段的功能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:37:03