Odoo销售订单自定义字段问题:从Partner ID取值及字段未找到报错
解决Odoo自定义字段"field not found"错误并从Partner ID取值
先看你当前的代码和问题:你想让自定义字段从Partner ID获取值,但目前遇到了"field not found"错误,同时当前代码里的字段是用默认方法返回固定值,没关联客户信息。咱们一步步来解决:
一、先排查"field not found"错误的原因
你的代码里有几个小问题会引发这个错误:
- 视图重复定义了inherit_id:在
<record>标签里写了两次<field name="inherit_id" ref="sale.view_order_form"/>,这会导致视图解析异常,Odoo可能无法正确识别你新增的字段 - 视图字段被注释:你把
<field name="custom_field"/>注释掉了,就算模型里有字段,视图没渲染也可能引发识别问题(不过更核心的原因是重复的inherit_id) - 模块未正确升级:如果修改了模型代码但没升级模块,Odoo数据库里还没创建这个字段,也会报field not found
二、修改代码实现从Partner ID取值的需求
你需要把自定义字段改成计算字段(或用onchange方法),这样就能自动从关联的partner_id里获取值。以下是修正后的完整代码:
1. 模型代码(models/sale_order.py)
from odoo import models, fields, api class SaleOrderInherited(models.Model): _inherit = 'sale.order' custom_field = fields.Text(string="Registration Note", compute="_compute_custom_field") @api.depends('partner_id') def _compute_custom_field(self): for order in self: # 这里可以根据需求从partner_id里取任意字段,示例取客户名称+备注 if order.partner_id: order.custom_field = f"客户:{order.partner_id.name},备注:{order.partner_id.comment or '无'}" else: order.custom_field = ""
- 用
compute属性绑定计算方法,depends('partner_id')表示当partner_id变化时自动重新计算字段值 - 遍历每个销售订单,根据partner_id的存在情况动态赋值
2. 视图代码(views/sale_order_views.xml)
<?xml version="1.0" encoding="utf-8" ?> <odoo> <data> <record id="sales_view_form" model="ir.ui.view"> <field name="inherit_id" ref="sale.view_order_form"/> <field name="model">sale.order</field> <field name="arch" type="xml"> <field name="date_order" position="after"> <field name="custom_field"/> </field> </field> </record> </data> </odoo>
- 去掉了重复的
inherit_id定义 - 取消了
<field name="custom_field"/>的注释,确保字段在视图中显示
三、后续操作步骤
- 重启Odoo服务(开发模式下可省略,但建议执行)
- 在Odoo后台找到你的自定义模块,点击升级按钮,确保模型和视图的修改同步到数据库
- 打开销售订单表单,选择客户后,就能看到custom_field自动显示从客户那里获取的值了
如果仍出现field not found错误,可以检查:
- 模块的
__manifest__.py里是否正确声明了models和views文件夹 - 确认模块已安装,且升级过程中没有报错
内容的提问来源于stack exchange,提问作者Burhan Ali
相关产品推荐
相关产品推荐

