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

Odoo中上下文传递的字段出现后快速消失问题求助

解决Odoo One2many上下文变量快速消失的问题

我经常碰到开发者遇到这个Odoo上下文传递的坑,咱们来一步步拆解问题和解决办法:

问题根源

你当前的代码里,把employee_id直接放在One2many字段的context里,但Odoo默认点击One2many树形视图的「添加」按钮时,不会自动将父字段的完整上下文传递给新建记录的弹窗,尤其是没有default_前缀的变量,Odoo不会将其识别为子记录的默认值进行赋值,所以看起来变量“消失”了。

解决方案

核心是用Odoo标准的default_前缀来传递默认值,同时确保上下文能正确传递到新建动作中,这里给你两种可行的写法:

方法1:直接在One2many字段的context中使用default_前缀

修改你的XML代码,将上下文里的键改为default_employee_id,这样Odoo会自动将父记录的employee_id设为子记录的默认值:

<field name="onetomany_ids" nolabel="1" context="{'default_employee_id': employee_id}">
    <tree string="Invoices">
        <field name="employee_id" />
    </tree>
</field>

这种写法最简单,适用于大多数场景,点击添加按钮后,子记录的employee_id会自动填充父记录的值,不会消失。

方法2:自定义添加按钮(更灵活)

如果需要更复杂的逻辑,或者默认的添加按钮不满足需求,可以自定义一个按钮,手动指定上下文:

<field name="onetomany_ids" nolabel="1">
    <tree string="Invoices">
        <field name="employee_id" />
        <!-- 自定义添加按钮,指定动作和上下文 -->
        <button 
            name="%(your_module.action_invoice_create)d" 
            type="action" 
            icon="fa-plus" 
            string="添加发票"
            context="{'default_employee_id': employee_id}"
        />
    </tree>
</field>

这里需要确保你已经在模块中定义了对应的动作action_invoice_create,动作的目标视图是子模型的表单视图。

关键注意点

  • 必须使用default_前缀:这是Odoo识别上下文默认值的标准约定,没有前缀的变量不会被自动赋值给子字段。
  • 检查子模型视图的上下文:如果子模型的表单视图自己设置了context属性,要确保它是合并父上下文而不是覆盖,比如用t-context="{'key': value, **context}"的方式保留父上下文。
  • 父记录状态:如果父记录是新建未保存的,employee_id可能是临时ID,但Odoo会自动处理这种情况,保存父记录后子记录的关联会自动更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:04:30