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
相关产品推荐
相关产品推荐

