Odoo 16创建新联系人时上下文传递异常问题求助
Odoo 16 上下文传递异常问题:创建新联系人时自定义字段不显示
我在开发Odoo 16模块时遇到一个问题:给res.partner添加了三个自定义字段,仅当上下文存在default_from_claims时才显示。但在claim.details表单的contact_id字段点击「创建并编辑」时,这些字段不显示;打开已有联系人时上下文传递正常,字段可见。
相关代码
res_partner.py
from odoo import models, fields, api class ResPartner(models.Model): _inherit = 'res.partner' age = fields.Integer(string="Age", tracking=True) sex = fields.Selection([ ('male', 'Male'), ('female', 'Female'), ('other', 'Other') ], string="Sex", tracking=True) occupational_group = fields.Selection([ ('white_collar', 'White Collar'), ('blue_collar', 'Blue Collar'), ('other', 'Other') ], string="Occupational Group", tracking=True) show_claim_fields = fields.Boolean(string="Show Claim Fields", compute="_compute_show_claim_fields") @api.depends_context('default_from_claims') def _compute_show_claim_fields(self): for partner in self: partner.show_claim_fields = self.env.context.get('default_from_claims', False)
res_partner_views.xml
<odoo> <data> <record id="view_partner_form_inherited" model="ir.ui.view"> <field name="name">res.partner.form.inherited</field> <field name="model">res.partner</field> <field name="inherit_id" ref="base.view_partner_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='vat']" position="after"> <field name="age" attrs="{'invisible': [('show_claim_fields', '=', False)]}"/> <field name="sex" attrs="{'invisible': [('show_claim_fields', '=', False)]}"/> <field name="occupational_group" attrs="{'invisible': [('show_claim_fields', '=', False)]}"/> <field name="show_claim_fields" invisible="1"/> </xpath> </field> </record> </data> </odoo>
claim_details_views.xml
<?xml version="1.0" encoding="utf-8"?> <odoo> <data> <record model="ir.actions.act_window" id="action_create_claim"> <field name="name">Add claim</field> <field name="type">ir.actions.act_window</field> <field name="res_model">claim.details</field> <field name="view_mode">form</field> <field name="target">new</field> <field name="context">{'default_policy_number': policy_number}</field> </record> <record id="action_create_contact" model="ir.actions.act_window"> <field name="name">Create Contact</field> <field name="type">ir.actions.act_window</field> <field name="res_model">res.partner</field> <field name="view_mode">form</field> <field name="target">new</field> <field name="context">{'default_from_claims': True}</field> </record> <record id="claim_details_view_form" model="ir.ui.view"> <field name="name">claim.details.view.form</field> <field name="model">claim.details</field> <field name="arch" type="xml"> <form string="Claim Details"> <sheet> <group> <group> <field name="force_readonly" invisible="1"/> <field name="external_policy_number" attrs="{'readonly': [('force_readonly', '=', True)]}"/> <field name="date_claimed"/> <field name="initial_reserve"/> <field name="claim_note"/> <field name="accident_date"/> <field name="contact_id" options="{'no_quick_create': True, 'action': 'action_create_contact'}" context="{'default_from_claims': True}"/> <field name="external_claim_number"/> <field name="cause_of_claim"/> </group>
问题原因及解决方法
原因分析
原方案依赖计算字段show_claim_fields的上下文判断,但新建联系人时,计算字段的上下文传递可能被Odoo的默认逻辑干扰,导致判断失效。
最优解决方案
直接在视图层通过上下文控制字段可见性,无需依赖计算字段,步骤如下:
删除计算字段相关代码
修改res_partner.py,移除show_claim_fields字段及其计算方法:from odoo import models, fields, api class ResPartner(models.Model): _inherit = 'res.partner' age = fields.Integer(string="Age", tracking=True) sex = fields.Selection([ ('male', 'Male'), ('female', 'Female'), ('other', 'Other') ], string="Sex", tracking=True) occupational_group = fields.Selection([ ('white_collar', 'White Collar'), ('blue_collar', 'Blue Collar'), ('other', 'Other') ], string="Occupational Group", tracking=True)修改视图,直接用上下文判断可见性
修改res_partner_views.xml,将字段的attrs直接关联上下文变量:<odoo> <data> <record id="view_partner_form_inherited" model="ir.ui.view"> <field name="name">res.partner.form.inherited</field> <field name="model">res.partner</field> <field name="inherit_id" ref="base.view_partner_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='vat']" position="after"> <field name="age" attrs="{'invisible': [('default_from_claims', '=', False)]}"/> <field name="sex" attrs="{'invisible': [('default_from_claims', '=', False)]}"/> <field name="occupational_group" attrs="{'invisible': [('default_from_claims', '=', False)]}"/> </xpath> </field> </record> </data> </odoo>确保上下文传递正常
保留claim_details表单中contact_id字段的context配置,或直接使用指定动作:<field name="contact_id" options="{'no_quick_create': True}" context="{'default_from_claims': True}"/>
这种方式跳过了计算字段的中间环节,直接在视图层处理上下文判断,避免了新建记录时的上下文传递问题,逻辑更简洁可靠。
内容的提问来源于stack exchange,提问作者Kamil Wolski
相关产品推荐
相关产品推荐

