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

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的默认逻辑干扰,导致判断失效。

最优解决方案

直接在视图层通过上下文控制字段可见性,无需依赖计算字段,步骤如下:

  1. 删除计算字段相关代码
    修改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)
    
  2. 修改视图,直接用上下文判断可见性
    修改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>
    
  3. 确保上下文传递正常
    保留claim_details表单中contact_id字段的context配置,或直接使用指定动作:

    <field name="contact_id" options="{'no_quick_create': True}" context="{'default_from_claims': True}"/>
    

这种方式跳过了计算字段的中间环节,直接在视图层处理上下文判断,避免了新建记录时的上下文传递问题,逻辑更简洁可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:45:53