如果在模型上定义了 on_change,则在 odoo 中定义 onchange 方法

Defining onchange methods in odoo if on_change is defined on the model

我正在尝试在字段 amountline_cr_ids.amount 字段上定义 onchange 事件 account.voucher 但任何定义如下:

@api.one
@api.depends('line_cr_ids', 'line_cr_ids.amount')
def _line_amount_onchange(self):
    ...

@api.one
@api.onchange('amount')                                 
def _onchange_amount(self):
    ...

从未被调用,我注意到在视图中的那些字段上定义了一个 on_change 参数。这是否意味着获得 onchange 的唯一方法是重新定义已经定义的那个?

是的,需要重新定义视图调用的on_change方法。 或者更改视图本身将其作为属性删除。

好的,所以我解决了我的问题,因为我不想删除 on_change 属性...有一种比使用 api.onchange 装饰器更好、更稳定的工作方式现在。我想装饰器会随着时间的推移变得更加稳定,但就我而言,它根本不适合。它会被调用,有时不会...对象的子对象无权访问父对象,因为 ORM 不允许...问我为什么我不知道...

也就是说圣杯是覆盖对象的 onchange 方法。

我注意到每当有事情发生时,它都会在我的 account.voucher 对象上调用 onchange 方法。

所以解决方案是创建一个方法:

class AccountVoucher(models.Model):
    ...
    @api.model
    def onchange(self, ids, values, field, fields):
        result = super(AccountVoucher, self).onchange(
            values, field, fields
        )
        #...
        # do whatever you want here change result and return it
        #...
        result

这样一来,所有的变化都是可见的,不会遗漏。它还会在调用 super 时调用其他 onchange,这样你就不会错过任何东西。如果您无论如何都需要使用装饰器,它不应该阻止任何工作。换句话说......在覆盖 onchange 的同时,您找到了问题的根源,没有什么能阻止您完成工作。