如何将父报价单的所有商品填充至Odoo向导的商品行?
解决方案:将父报价单商品填充到向导窗口的商品行
我来帮你搞定这个问题!在Odoo中把父报价单的商品导入向导的商品行,核心思路是遍历获取到的报价单行,逐个创建向导对应的行记录,下面结合你的代码片段一步步实现:
1. 完善向导的行模型与主模型定义
首先确保你的向导有对应的商品行模型,并且字段和报价单行的字段对应匹配:
from odoo import fields, models, api import logging # 先定义向导的商品行模型 class BackToBackOrderLine(models.Model): _name = "back.to.back.order.line" _description = "Back to Back Order Line" order_id = fields.Many2one('back.to.back.order', string="Wizard Reference") product_id = fields.Many2one('product.product', string="Product") product_uom_qty = fields.Float(string="Quantity") price_unit = fields.Float(string="Unit Price") # 可按需添加其他字段,比如商品描述、税率等,和报价单行字段对齐
然后更新你的主向导模型,补全核心字段和导入方法:
class BackToBackOrder(models.Model): _name = "back.to.back.order" _description = "Back to Back Order" # 假设你有字段关联父报价单,用于指定要导入的来源 parent_quotation_id = fields.Many2one('sale.order', string="Parent Quotation") line_ids = fields.One2many('back.to.back.order.line', 'order_id', string="Products") @api.multi def action_load_quotation_lines(self): """从父报价单加载商品行到向导""" # 先清空现有行,避免重复导入(不需要保留旧数据的话加这一步) self.line_ids.unlink() # 遍历父报价单的所有商品行,逐个创建向导行 for quotation_line in self.parent_quotation_id.order_line: self.env['back.to.back.order.line'].create({ 'order_id': self.id, 'product_id': quotation_line.product_id.id, 'product_uom_qty': quotation_line.product_uom_qty, 'price_unit': quotation_line.price_unit, # 其他字段按需映射,比如name=quotation_line.name,tax_id=quotation_line.tax_id.ids等 }) # 刷新向导界面,让新导入的商品行立即显示 return { 'type': 'ir.actions.act_window', 'res_model': self._name, 'res_id': self.id, 'view_mode': 'form', 'target': 'new', }
2. 关键逻辑说明
- 清空旧行:
self.line_ids.unlink()可以避免重复导入同一报价单的商品,若需要保留原有行可跳过此步骤。 - 字段映射:根据你实际的报价单行(
sale.order.line)和向导行字段,调整create()内的参数,确保所有必要信息都能正确同步。 - 触发方式:在向导的form视图里添加一个按钮,绑定上述
action_load_quotation_lines方法,用户点击即可完成导入。
3. 视图按钮配置示例(可选)
如果要在向导界面添加加载按钮,在对应的form视图XML中加入:
<button name="action_load_quotation_lines" string="Load Quotation Products" type="object" class="oe_highlight"/>
这样用户打开向导、选择父报价单后,点击按钮就能自动把所有商品填充到向导的商品行里啦!
内容的提问来源于stack exchange,提问作者KushiNii




