Odoo原型继承实现问题:继承crm.lead时遇异常
Odoo 模型继承与视图异常排查
问题背景
未完全掌握Odoo继承机制,尝试继承crm.lead模型编写了Model与View代码,但运行后出现异常。
Model代码
class learn_odoo(models.Model): _name = 'learn_odoo.learn_odoo' _inherit = ['crm.lead'] _description = 'learn_odoo.learn_odoo' tag_ids = fields.Many2many('mail.channel','mail_channel_profile_crm', 'partner_id', 'tag_id') job = fields.Char()
View代码
<record id="view_inherit_list_crm" model="ir.ui.view"> <field name="name">Learn Odoo</field> <field name="model">learn_odoo.learn_odoo</field> <field eval="1" name="priority"/> <field name="inherit_id" ref="crm.crm_case_tree_view_oppor"/> <field name="arch" type="xml"> <xpath expr="//field[@name='name']" position="after"> <field name="job"/> </xpath> </field> </record> <record id="learn_odoo.action_window" model="ir.actions.act_window"> <field name="name">Learn Odoo</field> <field name="type">ir.actions.act_window</field> <field name="res_model">learn_odoo.learn_odoo</field> <field name="view_mode">tree,form</field> <field name="help" type="html"> <p class="oe_view_nocontent_create"> </p> <p> </p> </field> </record>
异常信息(翻译后)
模型
learn_odoo.learn_odoo中不存在字段id
问题分析与解决方案
核心问题1:继承类型错误
你当前同时指定_name和_inherit,使用的是委托继承,这种方式会创建全新模型,通过关联字段crm_lead_id绑定原crm.lead记录,而非直接扩展原模型的字段。但你继承的视图依赖crm.lead的原生字段(如id),新模型并不直接拥有这些字段,因此触发报错。
核心问题2:视图继承对象不匹配
视图继承的inherit_id指向crm.crm_case_tree_view_oppor,该视图的关联模型是crm.lead,但你的视图指定模型为learn_odoo.learn_odoo,两者模型不匹配,Odoo无法解析继承关系。
解决方案(根据需求二选一)
方案1:扩展原crm.lead模型(经典继承)
如果需求是在原CRM线索模型上新增字段,而非创建新模型,修改Model代码:
class CrmLeadInherit(models.Model): _inherit = 'crm.lead' _description = '扩展CRM线索模型' tag_ids = fields.Many2many('mail.channel','mail_channel_profile_crm', 'partner_id', 'tag_id') job = fields.Char()
同时修改View代码的关联模型:
<record id="view_inherit_list_crm" model="ir.ui.view"> <field name="name">扩展CRM线索列表</field> <field name="model">crm.lead</field> <field eval="1" name="priority"/> <field name="inherit_id" ref="crm.crm_case_tree_view_oppor"/> <field name="arch" type="xml"> <xpath expr="//field[@name='name']" position="after"> <field name="job"/> </xpath> </field> </record>
此方案无需单独创建动作窗口,新增字段会直接显示在原CRM线索的视图中。
方案2:正确配置委托继承视图
如果确实需要创建新模型,需调整视图结构,通过委托字段访问原模型内容:
- 委托继承会自动生成
crm_lead_id字段,用于关联原crm.lead记录 - 修改视图为非继承模式,直接定义结构:
<record id="learn_odoo_tree_view" model="ir.ui.view"> <field name="name">Learn Odoo 列表视图</field> <field name="model">learn_odoo.learn_odoo</field> <field name="arch" type="xml"> <tree> <field name="crm_lead_id" string="关联线索"/> <field name="job"/> <!-- 如需显示原模型字段,使用 crm_lead_id.字段名 格式 --> <field name="crm_lead_id.name"/> </tree> </field> </record> <record id="learn_odoo.action_window" model="ir.actions.act_window"> <field name="name">Learn Odoo</field> <field name="type">ir.actions.act_window</field> <field name="res_model">learn_odoo.learn_odoo</field> <field name="view_mode">tree,form</field> <field name="help" type="html"> <p class="oe_view_nocontent_create"> 创建一条新记录 </p> </field> </record>
同时修正tag_ids的关联表参数,避免与原模型冲突:
tag_ids = fields.Many2many('mail.channel', 'mail_channel_learn_odoo_rel', 'learn_odoo_id', 'channel_id')
内容的提问来源于stack exchange,提问作者OathKeeper
相关产品推荐
相关产品推荐

