Odoo14中Many2one字段从关联列表自动设置默认值问题
问题解决方法
首先明确现有代码的问题:
- 你写的两个
@api.onchange方法逻辑完全错误,不需要使用onchange实现该需求,首先删掉所有你新增的onchange代码:- 方案1错误原因:
@api.onchange装饰的方法要求返回格式为包含value/domain/warning键的字典,你直接返回了列表,Odoo框架将返回值当做字典调用get()方法,因此抛出'list' object has no attribute 'get'异常 - 方案2错误原因:onchange触发时记录还处于前端编辑的临时状态,并未写入数据库,调用
write()方法是无效操作,完全不需要写持久化逻辑
- 方案1错误原因:
正确实现方案
方案1:依赖Odoo默认规则实现(最简洁,无需新增代码)
Odoo本身支持default_字段名格式的上下文参数自动填充对应字段的默认值,你当前在Plant视图的one2many字段上已经配置了context="{'default_plant_id': active_id}",理论上直接就可以生效,仅需确认两个配置:
- 确认是从Plant表单页的data_source_ids列表点击创建按钮触发的子记录新增,只有这个入口的创建请求会携带你配置的上下文参数,如果是从侧边菜单直接进入DataSource列表页创建,上下文没有
default_plant_id,自然不会自动填充 - 确认子模型
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
相关产品推荐
相关产品推荐

