Odoo 8中向One2many字段写入值失败问题求助
解决Odoo v8向导中One2many字段写入后窗口直接关闭且无效果的问题
看起来你遇到的问题主要有几个关键点,我帮你逐一分析并给出解决方案:
核心问题分析
- 向导自动关闭的原因:Odoo里向导的
type="object"按钮,如果对应的Python方法没有返回任何值,系统会默认触发窗口关闭动作,这就是你点击按钮后窗口直接消失的原因。 - 隐藏的字段拼写错误:你的代码里
'quantity '后面多了一个空格!这个小错误会让Odoo无法识别字段,导致写入操作静默失败(你可以查看Odoo的debug日志确认这一点)。 - 重复
write的效率问题:你循环里每次都调用self.write,这会触发多次数据库操作,不仅低效,还可能导致视图刷新不及时。
具体解决方案
1. 修正字段拼写错误
首先把代码里的'quantity '改成'quantity',去掉多余的空格,这是让写入生效的前提。
2. 重构按钮函数,保持窗口并批量写入
修改你的Python方法,一次性构造所有要添加的One2many记录,执行一次写入后返回特定action,让向导窗口保持打开并刷新视图,这样就能看到新增的记录了:
def split_qty(self, cr, uid, ids, context=None): # 获取当前向导实例 wizard = self.browse(cr, uid, ids[0], context=context) # 确保下面的变量已正确赋值(根据你的实际逻辑调整) pID = # 替换为你的product_id实际值 sID = # 替换为你的sourceloc_id实际值 dID = # 替换为你的destinationloc_id实际值 # 批量构造要添加的One2many记录 new_item_list = [] for _ in range(1, 11): new_item_list.append((0, 0, { 'product_id': pID, 'quantity': 1, 'sourceloc_id': sID, 'destinationloc_id': dID })) # 一次性写入所有记录 self.write(cr, uid, ids, {'item_ids': new_item_list}, context=context) # 返回action,保持向导窗口打开并刷新表单 return { 'type': 'ir.actions.act_window', 'res_model': self._name, 'res_id': ids[0], 'view_mode': 'form', 'view_type': 'form', 'target': 'new', 'context': context, }
3. 验证字段关联正确性
确认你的item_ids字段定义正确,关联的子模型确实存在product_id、quantity等字段,并且字段类型匹配(比如product_id是many2one类型,quantity是integer或float类型)。
额外调试技巧
如果还是有问题,可以启动Odoo时加上--log-level=debug参数,查看详细日志,这样就能捕捉到隐藏的错误信息,比如字段不存在、权限不足等问题。
内容的提问来源于stack exchange,提问作者Arsalan Sherwani
相关产品推荐
相关产品推荐

