首页 > 解决方案 > 如何在 Odoo 10 的 onchange 方法中向 One2many 字段添加一些新记录?

问题描述

我正在尝试通过onchange方法修改One2many字段。我需要的是添加一些记录,但在onchange计算之前保留一些现有的记录。

更准确地说,我有一个名为tax_line_ids. 此字段存储税金。税有一个名为 的manual字段Boolean

因此,每次字段my_field更改时,我都需要向One2many字段添加新税,但我需要保留已设置为Truetax_line_ids的旧税。manual

尝试A

@api.onchange('my_field')
def onchange_my_field(self):
    new_tax_lines = []
    tax_line_ids = self.tax_line_ids.filtered(
        lambda r: r.manual).ids
    # get_taxes_values returns a list of dictionaries with values
    tax_grouped = self.get_taxes_values()
    for tax in tax_grouped.values():
        new_tax = self.env['account.invoice.tax'].create(tax)
        tax_line_ids.append(new_tax.id)
    self.tax_line_ids = [(6, 0, tax_line_ids)]

问题

onchange方法工作正常,但是当我单击保存按钮时,我的 onchange 方法引入的记录消失tax_line_ids了(不是只读字段)。tax_line_ids

尝试 B

@api.onchange('my_field')
def onchange_my_field(self):
    new_tax_lines = []
    manual_tax_lines = self.tax_line_ids.filtered(
        lambda r: r.manual)
    for manual_tax_line in manual_tax_lines:
        new_tax_lines.append(manual_tax_line.sudo().read()[0])
    tax_grouped = self.get_taxes_values()
    for tax in tax_grouped.values():
        new_tax_lines.append((0, 0, tax))
    self.tax_line_ids = new_tax_lines

问题

onchange方法第一次工作正常,即使我点击保存按钮(记录不会消失),但如果我my_field在保存前第二次修改,我会收到安全访问错误(我正在与管理员合作):

(文件类型:account.invoice.tax,Operación:阅读)

这就是为什么我sudo()在 之前添加的原因read(),以防万一,但错误仍然存​​在。

结论

那么,在我的onchange方法中,如何将新记录添加到One2many字段中以保留一些现有记录?

标签: pythonpython-2.7odooodoo-10

解决方案


@api.onchange('my_field')
def onchange_my_field(self):
    tax_line_ids = self.tax_line_ids.filtered(
        lambda r: r.manual).ids
    # get_taxes_values returns a list of dictionaries with values
    tax_grouped = self.get_taxes_values()
    new_tax_datas = []
    for tax in tax_grouped.values():
        new_tax_datas.append(tax)
    self.tax_line_ids = [
        (4, tl_id) for tl_id in tax_line_ids,
        (0, 0, td) for td in new_tax_datas]

或者

@api.onchange('my_field')
def onchange_my_field(self):
    new_tax_lines = []
    tax_lines = self.tax_line_ids.filtered(
        lambda r: r.manual)
    # get_taxes_values returns a list of dictionaries with values
    tax_grouped = self.get_taxes_values()
    for tax in tax_grouped.values():
        new_tax = self.env['account.invoice.tax'].create(tax)
        tax_lines += new_tax
    self.tax_line_ids = [(6, 0, tax_lines.ids)]

推荐阅读