奥多12。如何重写被重写的函数?

2024-09-25 10:26:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想重写一个write方法,该方法已经重写了相同模型的相同方法

最初的方法是这样的:

@api.multi
    def write(self, values):
        if list(values.keys()) != ['time_ids'] and any(workorder.state == 'done' for workorder in self):
            raise UserError(_('You cannot modify a close workorder'))
        
        return super(MrpWorkorder, self).write(values)

我需要将if语句更改为:

@api.multi
    def write(self, values):
        if list(values.keys()) != ['time_ids'] and any(workorder.state == 'cancel' for workorder in self):
            raise UserError(_('You cannot modify a close workorder'))
        
        return super(MrpWorkorder, self).write(values)

但当我这样做时,“super”将执行该方法的旧内容

所以,我需要知道如何重写重写的方法


Tags: and方法selfapiidsiftimedef
2条回答

如果要指定要覆盖其被覆盖的内置函数的模块,请执行以下操作:

导入课程(这里我从hr\U假期模块导入hr.leave课程):

from odoo.addons.hr_holidays.models.hr_leave import HolidaysRequest as HRLeavesInherit

然后复制整个函数并返回以下内容:

result = super(HRLeavesInherit,self).write(values)

hr离开她<;不是继承类名。。因此,您必须将继承类名更改为不同的名称

为了满足我们的需求,解决方案比您想象的要简单:

只需从以下位置更改退货:

return super(MrpWorkorder, self).write(values)

为此:

return models.Model.write(self, values)

这样,您可以重写原始方法,并避免所有其他已重写的现有方法。 当您必须这样做时,这是一种非常特殊的情况,因此如果您不想丢失其他模块中的一些重写方法,请小心

这也适用于写入和取消链接方法

相关问题 更多 >