【问题标题】:Defining onchange methods in odoo if on_change is defined on the model如果在模型上定义了 on_change,则在 odoo 中定义 onchange 方法
【发布时间】:2016-02-08 15:10:51
【问题描述】:

我正在尝试在 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 的唯一方法是重新定义已经定义的那个?

【问题讨论】:

    标签: openerp onchange


    【解决方案1】:

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

    【讨论】:

    • 我找到了更好的解决方案。
    【解决方案2】:

    好的,所以我解决了我的问题,因为我不想删除 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 时,您正在解决问题的根源,没有什么能阻止您完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2013-10-20
      相关资源
      最近更新 更多