在Odoo中覆盖基本方法是不错的选择?

时间:2018-01-11 03:53:28

标签: python odoo-10 odoo

我在自定义模块中创建了一个新方法,当用户在销售订单中点击按钮confirm时,我想使用我的方法。所以我做了研究,找到了完成这项工作的简单解决方案。

  • 覆盖基本方法。在这种情况下,使用action_confirm()方法sale.py中的方法super()

所以我只是想知道,这是正确的方法吗?有比这更好的解决方案吗?请建议我。

2 个答案:

答案 0 :(得分:2)

覆盖任何方法的最佳方法是使用super()来执行旧功能,并避免破坏其他模块方法的功能,这些方法也会覆盖该源方法。如果你这样做,那你就做得很好。但有时您会发现无法使用super()的情况,您需要复制源代码以修改其中的任何内容。在这种情况下,你必须小心并注意你要覆盖的内容。

  

示例A

  • 您使用的基本方法action_confirm()sale模块创建。
  • 您安装了一个名为sale_extension的模块,该模块使用action_confirm()覆盖super()方法。
  • 然后安装自定义模块,同时使用action_confirm()覆盖super()
  • 调用action_confirm()时,它将执行salesale_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)

在以下情况下使用覆盖:

  • 通过重新定义方法,调用来扩展基本功能 使用super
  • 的motherclass方法
  • 当需要新行为时替换原始功能

是的,您可以通过继承类" 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