如果在模型上定义了 on_change,则在 odoo 中定义 onchange 方法
Defining onchange methods in odoo if on_change is defined on the model
我正在尝试在字段 amount
和 line_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
的同时,您找到了问题的根源,没有什么能阻止您完成工作。
我正在尝试在字段 amount
和 line_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
的同时,您找到了问题的根源,没有什么能阻止您完成工作。