網(wǎng)站開(kāi)發(fā)公司杭州網(wǎng)站建設(shè)今日頭條新聞手機(jī)版
前言
到目前為止,我們主要通過(guò)聲明字段和視圖來(lái)構(gòu)建我們的模塊。在上一章中,我們剛剛通過(guò)計(jì)算字段和onchanges引入了業(yè)務(wù)邏輯。在任何真實(shí)的業(yè)務(wù)場(chǎng)景中,我們都會(huì)希望將一些業(yè)務(wù)邏輯鏈接到操作按鈕。在我們的房地產(chǎn)示例中,我們希望能夠:
-
取消或設(shè)置已售出屬性
-
接受或拒絕報(bào)價(jià)
有人可能會(huì)說(shuō),我們可以通過(guò)手動(dòng)更改狀態(tài)來(lái)做這些事情,但這并不方便。此外,我們想添加一些額外的處理:當(dāng)接受要約時(shí),我們想設(shè)置房產(chǎn)的銷售價(jià)格和買方。
Object Type
目標(biāo)
-
設(shè)置取消或?qū)⒎慨a(chǎn)設(shè)置為已售出:
已取消的屬性不能出售,已出售的屬性也不能取消。為了清晰起見(jiàn),在視圖上添加了state字段。 -
設(shè)置接受或拒絕一份工作:
-
一旦報(bào)價(jià)被接受,賣方和買方的價(jià)格應(yīng)確定:
在我們的房地產(chǎn)模塊中,我們希望將業(yè)務(wù)邏輯與一些按鈕鏈接起來(lái)。最常見(jiàn)的做法是: -
在表單視圖中添加一個(gè)按鈕,例如在表單視圖的頭部:
<form><header><button name="action_do_something" type="object" string="Do Something"/></header><sheet><field name="name"/></sheet>
</form>
并將此按鈕鏈接到業(yè)務(wù)邏輯代碼(即 py模型的方法中)中:
from odoo import fields, modelsclass TestAction(models.Model):_name = "test.action"name = fields.Char()def action_do_something(self):for record in self:record.name = "Something"return True
通過(guò)將 type=“object” 賦值給按鈕,Odoo框架將在給定模型上執(zhí)行一個(gè)name=“action_do_something” 的Python方法。
要注意的第一個(gè)重要細(xì)節(jié)是,我們的方法名沒(méi)有下劃線(_)作為前綴。這使得我們的方法成為一個(gè)公共方法,可以直接從Odoo接口調(diào)用(通過(guò)RPC調(diào)用)。到目前為止,我們創(chuàng)建的所有方法(compute, onchange)都是在內(nèi)部調(diào)用的,所以我們使用了帶有下劃線前綴的私有方法。應(yīng)該始終將方法定義為私有的,除非需要從用戶界面調(diào)用它們。
還要注意,我們?cè)?strong>self上循環(huán)。總是假設(shè)一個(gè)方法可以在多個(gè)記錄上調(diào)用;這有利于可重用性。
最后,公共方法應(yīng)該總是返回一些東西,以便可以通過(guò)XML-RPC調(diào)用它。當(dāng)有疑問(wèn)時(shí),只需返回True。
在Odoo源代碼中有數(shù)百個(gè)示例。視圖中的這個(gè)按鈕和它對(duì)應(yīng)的Python方法就是一個(gè)例子
<button name="action_set_won_rainbowman" string="Mark Won"type="object" class="oe_highlight"attrs="{'invisible': ['|','|', ('active','=',False), ('probability', '=', 100), ('type', '=', 'lead')]}"/>
對(duì)應(yīng)的Python方法
def action_set_won_rainbowman(self):self.ensure_one()self.action_set_won()message = self._get_rainbowman_message()if message:return {'effect': {'fadeout': 'slow','message': message,'img_url': '/web/image/%s/%s/image_1024' % (self.team_id.user_id._name, self.team_id.user_id.id) if self.team_id.user_id.image_1024 else '/web/static/src/img/smile.svg','type': 'rainbow_man',}}return True
Action Type
之前我們創(chuàng)建了一個(gè)菜單操作(action)鏈接到菜單的動(dòng)作。
<menuitem id="properties_menu_action" name="廣告信息" action="action_estate_property"/>
你可能想知道是否可以將操作(action)鏈接到按鈕。一種方法是:
<button type="action" name="%(action_estate_property)d" string="My Action"/>
我們使用 type=“action” ,并在name中引用外部標(biāo)識(shí)符。
在下一章中,我們將看到如何防止在Odoo中編碼不正確的數(shù)據(jù)。