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

Odoo14中Many2one字段从关联列表自动设置默认值问题

问题解决方法

首先明确现有代码的问题:

  • 你写的两个@api.onchange方法逻辑完全错误,不需要使用onchange实现该需求,首先删掉所有你新增的onchange代码:
    • 方案1错误原因:@api.onchange装饰的方法要求返回格式为包含value/domain/warning键的字典,你直接返回了列表,Odoo框架将返回值当做字典调用get()方法,因此抛出'list' object has no attribute 'get'异常
    • 方案2错误原因:onchange触发时记录还处于前端编辑的临时状态,并未写入数据库,调用write()方法是无效操作,完全不需要写持久化逻辑

正确实现方案

方案1:依赖Odoo默认规则实现(最简洁,无需新增代码)

Odoo本身支持default_字段名格式的上下文参数自动填充对应字段的默认值,你当前在Plant视图的one2many字段上已经配置了context="{'default_plant_id': active_id}",理论上直接就可以生效,仅需确认两个配置:

  1. 确认是从Plant表单页的data_source_ids列表点击创建按钮触发的子记录新增,只有这个入口的创建请求会携带你配置的上下文参数,如果是从侧边菜单直接进入DataSource列表页创建,上下文没有default_plant_id,自然不会自动填充
  2. 确认子模型DataSource的plant_id字段没有手动指定default参数覆盖默认值,你当前贴出的代码没有该问题,正常即可生效

方案2:重写default_get方法主动取值(兼容性最强,不会受视图配置影响)

如果方案1不生效,直接在DataSource模型中重写default_get方法,主动从上下文读取参数赋值即可,代码如下:

class DataSource(models.Model):
    _name = 'db.data_source'
    _description = 'db.data_source'

    name = fields.Char("Name", required=True)
    plant_id = fields.Many2one('db.plant', name="Plant", required=True)

    def default_get(self, fields_list):
        res = super(DataSource, self).default_get(fields_list)
        # 从上下文读取传递的plant_id
        default_plant_id = self._context.get('default_plant_id')
        if default_plant_id and 'plant_id' in fields_list:
            res['plant_id'] = default_plant_id
        return res

该方法会在记录创建前的默认值读取阶段直接赋值,无需修改任何视图配置,你原有的plant_id的domain配置可以保留,用于限制用户不能修改为其他plant。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:54:07