如何正确继承Odoo Sale模块类并修改字段?报错求助
解决Odoo自定义销售订单模块的视图继承错误
问题拆解
你遇到的两次错误都是因为模型和视图的对应关系没处理对,咱们一步步理清楚:
第一次错误的核心原因
你一开始创建了一个全新的模型mymodule.sale.order,但却试图继承原Odoo销售订单的视图(sale.view_order_form)。原视图里的origin这类字段是属于原生sale.order模型的,你的新模型根本没定义这些字段,所以Odoo解析视图时自然会报错找不到origin。
第二次错误的问题点
你改成给sale.order加_inherit继承是走对方向了,但视图还是有两个问题:
- 你要替换的
product_id是销售订单行(sale.order.line)里的字段,不是主订单sale.order的字段,所以在主订单视图里根本找不到这个字段,导致Odoo识别不了你要替换的目标,进而报错说自定义字段不存在(错误里的randa_product_id应该是笔误,实际是mymodule_product_id)。 - 视图的
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
相关产品推荐
相关产品推荐

