我试图从Odoo覆盖一个python方法,但没有成功。
我正在做的是
from odoo import models, fields, api
class MYBaseModel(models.BaseModel):
_register = False
@api.multi
def unlink(self):
print "My Method called"
return super(MYBaseModel, self).unlink()
我想要实现的是当odoo框架执行unlink方法时,应该调用我的方法,
但是现在我的方法没有被调用,我不知道原因。谁能告诉我我做错了什么?
编辑:
我的目标是为所有模型调用取消关联方法。所以在任何模型中记录都被删除,我的方法应该被调用,然后应该调用基本方法。
答案 0 :(得分:2)
我认为你已经正确地编写了这个函数,但是错过了在你的课程中添加_inherit
。
您需要执行此操作,需要在Class MYBaseModel
中添加_inherit='object.name'。
而不是super(MYBaseModel, self).unlink()
调用models.BaseModel.unlink()
,但会跳过您模型的所有unlink()扩展。
答案 1 :(得分:2)
试试这个_register_hook
方法
有关更多详细信息和示例,请从Addons中检查文件。
./附加元件/ base_action_rule /模型/ base_action_rule.py
答案 2 :(得分:1)
您需要添加_inherit
属性,如下所示:
from odoo import models, fields, api
class MYBaseModel(models.BaseModel):
_register = False
_inherit = 'my.base.model'
@api.multi
def unlink(self):
print "My Method called"
return super(MYBaseModel, self).unlink()
修改强>
import odoo.models.BaseModel as base
class newClass(base):
def unlink(self):
# your code
return super(newClass, self).unlink()
答案 3 :(得分:0)
正如Surajano在答案中所说,
您现在所做的是定义一个新的BaseModel。但就目前而言,没有任何魔法可以使其适用于现有模型。
您有2个选项(至少):
1-通过python继承现有模型 - 用MyBaseModel
继承它们:( Surajano建议)
from odoo.addons.your_addon.models import MYBaseModel
class AccountInvoice(MYBaseModel):
_inherit = 'account.invoice'
# now, invoices (and only them) will benefit or your override
2-否则,你可以做一个猴子补丁:
odoo.models.BaseModel.unlink = MYBaseModel.unlink
# or even this : odoo.models.BaseModel = MYBaseModel, but i'm not really sure it will work
每个Odoo模型都可以使用它,但这种方法更加“明确”
(编辑:我不确定,但您可能需要在修补它之前保留原始取消链接方法的跟踪,并在unlink()覆盖中使用此original_method)< / p>
希望它可以帮到你,
答案 4 :(得分:0)
尝试使用以下代码:
from odoo import models, fields, api
class MYBaseModel(models.Model):
_register = False
_inherit = "ir.model"
@api.multi
def unlink(self):
print "My Method called"
return super(MYBaseModel, self).unlink()