我在自定义模块中创建了一个新方法,当用户在销售订单中点击按钮confirm
时,我想使用我的方法。所以我做了研究,找到了完成这项工作的简单解决方案。
action_confirm()
方法sale.py
中的方法super()
。所以我只是想知道,这是正确的方法吗?有比这更好的解决方案吗?请建议我。
答案 0 :(得分:2)
覆盖任何方法的最佳方法是使用super()
来执行旧功能,并避免破坏其他模块方法的功能,这些方法也会覆盖该源方法。如果你这样做,那你就做得很好。但有时您会发现无法使用super()
的情况,您需要复制源代码以修改其中的任何内容。在这种情况下,你必须小心并注意你要覆盖的内容。
示例A
action_confirm()
由sale
模块创建。sale_extension
的模块,该模块使用action_confirm()
覆盖super()
方法。action_confirm()
覆盖super()
。action_confirm()
时,它将执行sale
,sale_extension
和您的模块功能。例B
action_confirm()
由sale
模块创建。sale_extension
的模块,该模块使用action_confirm()
覆盖super()
方法。action_confirm()
而没有super()
,因此您已经复制了action_confirm()
的源代码并对其进行了修改。action_confirm()
时,它将执行sale
和您的模块功能,但不会执行sale_extension
。sale_extension
引入的代码,然后修改它。action_confirm()
,您的代码将忽略其更改。所以结论是,如果你使用super()
,你在安装新模块时不会遇到方法问题(尽管有些情况下即使使用super()
,你也会必须修改您的代码以使其适应新安装的模块功能。)
答案 1 :(得分:2)
在以下情况下使用覆盖:
是的,您可以通过继承类" sale.order"来覆盖该方法。像这样:
class SalesOrderExtend(models.Model):
_inherit = "sale.order"
@api.multi
def action_confirm(self):
ret = super(SalesOrderExtend,self).action_confirm()
....
your code
....
return True
)
在此工资核算国际化代码fromp odoo中查看一些覆盖超类方法的示例:
https://github.com/odoo/odoo/blob/11.0/addons/l10n_in_hr_payroll/models/l10n_in_hr_payroll.py