2017-04-13 34 views
0

我想重寫Odoo的python方法,但沒有取得成功。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框架執行取消鏈接的方法,我的方法應該叫什麼,

但現在我的方法沒有被調用,我不知道原因。任何人都可以告訴我我做錯了什麼?

編輯:

我的目標是調用取消鏈接方法爲所有的車型。所以在任何模型中記錄被刪除,我的方法應該被調用,然後應該調用基方法。

回答

2

試試這個方法_register_hook對於 更多的細節和例子從附加組件檢查文件。

./addons/base_action_rule/models/base_action_rule.py

+0

這就是所謂的天才答案! –

2

我認爲你已經寫出了正確的功能,但是想念在你的課堂上添加_inherit。 以下是您需要做的事情,您需要在Class MYBaseModel中添加_inherit='object.name'

而不是super(MYBaseModel, self).unlink()請致電models.BaseModel.unlink()但這會跳過您的模型的所有unlink()擴展。

+0

你是正確的,但在這種情況下,我想繼承odoo示範基地,我想修改基本取消鏈接的方法。 –

+0

它不是,我不是創建或繼承任何模型,我重寫odoo base unlink方法。 –

+0

但我的問題是我只是繼承BaseModel類,它應該一般重寫unlink。爲什麼我的重寫方法沒有被調用? –

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() 
+0

查看我的編輯以瞭解我想實現的目標。 –

+0

尼斯,我得到了你的觀點:你需要添加一個Python繼承不是Odoo繼承: 進口odoo.models.BaseModel爲基礎 –

+0

我做編輯。 –

0

由於Surajano在其回答說,

你做了什麼,現在是定義一個新的BaseModel。但是現在,沒有任何魔法會使它適用於現有的模型。

您有2個選項(至少):與MyBaseModel

1-覆蓋現有車型的蟒蛇,繼承他們:(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,但這種做法是有點「definiti已經」

編輯:我不知道,但你可能需要保持原有的取消鏈接方法的跟蹤之前猴修補它,並在取消鏈接使用此original_method()重寫)

希望它可以幫助你,

+0

我知道odoo的_inherit。但我想爲所有的odoo車型打電話給我的unlink方法。這就是我繼承BaseModel的原因。 –

+0

這正是我說的^^ 還有就是發佈新類的現有Odoo車型沒有直接的方法(它們已經被與傳統BaseModel定義)。 這就是爲什麼我指出你2種方式重新申請自己的修改,無論是模型每個模型(第一選項)或所有odoo模型(第二個選項,這可能是你所需要的)。 你能嘗試猴子補丁,並告訴我,如果它可以幫助你? –

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()