Я пытаюсь изменить поле One2many с помощью метода onchange . Мне нужно добавить некоторые записи, но сохранить некоторые из существующих до вычисления onchange .
Чтобы быть более точным, у меня есть поле с именем tax_line_ids
. В этом поле хранятся налоги. У налогов есть поле с именем manual
, Boolean
.
. Поэтому при каждом изменении поля my_field
мне нужно добавлять новые налоги в поле One2many tax_line_ids
, но мне нужно сохранить старые, для которых manual
установлено на True .
Попытка 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 работает нормально, но когда я нажимаю кнопку Сохранить , записи tax_line_ids
, представленные моим onchange метод исчезнуть (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, Операция: чтение)
Это причина, по которой я добавил sudo()
до read()
, на всякий случай, но ошибка все еще остается.
Заключение
Итак, в моем методе onchange , как добавить новые записи в поле One2many , сохранив некоторые из существующих?