摘要:大家好鴨,我又來更新啦還記得我們?cè)诘诙坛讨刑岬竭^的動(dòng)作嗎,今天我們就來專門講講在中的,學(xué)習(xí)不同類型的動(dòng)作對(duì)應(yīng)的應(yīng)用場(chǎng)景,并且在我們的應(yīng)用中使用上其中一些類型的動(dòng)作。報(bào)表動(dòng)作這類型的動(dòng)作用于觸發(fā)報(bào)表打印,例如打印發(fā)票等。
大家好鴨,我又來更新啦!還記得我們?cè)诘诙坛讨刑岬竭^的動(dòng)作(actions)嗎,今天我們就來專門講講在 Odoo 中的 action,學(xué)習(xí)不同類型的動(dòng)作對(duì)應(yīng)的應(yīng)用場(chǎng)景,并且在我們的 Todo 應(yīng)用中使用上其中一些類型的動(dòng)作。
窗口動(dòng)作窗口動(dòng)作在 Odoo 中是最常見也是最常用的動(dòng)作類型,在第二篇教程中我們創(chuàng)建菜單的時(shí)候就已經(jīng)用過窗口動(dòng)作了,我們打開 menus.xml 來看看一個(gè)窗口動(dòng)作的組成:
待辦事項(xiàng) todo.task form tree,form current
這里的 model 之前我們也說過,對(duì)應(yīng)的是這個(gè)動(dòng)作的類型(每個(gè)類型的動(dòng)作都對(duì)應(yīng)一個(gè)模型),我們重點(diǎn)來看看下面列出的字段以及沒有列出來的字段,分別說明一下它們各自的作用。
res_model:要打開的視圖(窗口)關(guān)聯(lián)的數(shù)據(jù)模型
view_type:視圖類型,默認(rèn)值為 form,一般情況下我們?nèi)∧J(rèn)值就可以了
view_mode:允許打開的視圖類型,以逗號(hào)分隔,默認(rèn)值為 tree,form
target:打開的窗口類型,常用的有 current(當(dāng)前窗口打開)和 new (彈窗打開)這兩種,默認(rèn)為 current
除了上述列出的一些字段外,還有一些非必填的字段在某些時(shí)候我們是會(huì)用上的,這里也分列出來:
view_ids:關(guān)聯(lián)的視圖對(duì)象 id,需注意區(qū)分和 view_id 的區(qū)別
view_id:關(guān)聯(lián)的視圖的 id, 例如在不同時(shí)候需要打開同一個(gè)數(shù)據(jù)模型不同的表單視圖,就可以通過這個(gè)字段指定要打開的視圖的 id
res_id:僅在視圖類型為 form 時(shí)有效,表示打開該 id 對(duì)應(yīng)的記錄的表單視圖,如未指定則打開新建頁(yè)面
context:傳遞到上下文中的數(shù)據(jù),一個(gè)字典
domain:過濾規(guī)則,對(duì)視圖中的記錄進(jìn)行過濾
limit:列表中每頁(yè)顯示的記錄數(shù)量,默認(rèn)為 80
search_view_id:指定搜索視圖,不指定則按默認(rèn)規(guī)則加載
multi:如果設(shè)置為 True 且動(dòng)作綁定了模型(src_model)的話,該動(dòng)作按鈕會(huì)只出現(xiàn)在所綁定模型列表視圖的「動(dòng)作」下拉列表中(在搜索視圖左側(cè))
views:由 (view_id, view_type) 這樣的元組對(duì)組成的列表,view_id 為指定視圖的 id 或是 False(按默認(rèn)值取出對(duì)應(yīng)視圖),view_type 表示視圖類型
其中 views 是一個(gè)計(jì)算字段,該字段會(huì)根據(jù) view_ids, view_mode 和 view_id 自動(dòng)計(jì)算出來,大致分為三個(gè)步驟:
從 view_ids 中順序取出 id 和視圖類型,組成 (view_id, view_type) 元組對(duì)加入到 views 列表中
若定義了 view_id 且對(duì)應(yīng)的視圖類型不在 view_ids 中,則加入到 views 中
最后對(duì) view_mode 中指定的視圖類型,但是不存在于 view_ids 和 view_id 中,則將其 view_id 置為 False 組成元組對(duì)后加入到 views 中
這里需要強(qiáng)調(diào)一點(diǎn)的是,如果我們?cè)谀承r(shí)候需要直接通過 Python 代碼或 JS 代碼打開一個(gè)窗口動(dòng)作,此時(shí)我們將需要自己添加 views 字段,否則將會(huì)拋出錯(cuò)誤,具體的實(shí)例我們將在之后使用到了再進(jìn)行講解分析。
服務(wù)器動(dòng)作Server Action 可以在服務(wù)端執(zhí)行復(fù)雜的邏輯代碼,是非常強(qiáng)大的一種動(dòng)作類型。我們先給代辦事項(xiàng)添加一個(gè) Server Action 用于快速完成任務(wù)的動(dòng)作,這樣我們就不用每次都要點(diǎn)進(jìn)去一個(gè)任務(wù)然后進(jìn)入編輯狀態(tài)再勾選保存這么多步驟了。
我們來看看定義一個(gè)最簡(jiǎn)單的 Server Action 應(yīng)該包含哪些內(nèi)容:
標(biāo)記完成 code records.write({"is_done": True})
和其他所有在數(shù)據(jù)文件(XML)中定義的數(shù)據(jù)一樣,首先是一個(gè)包含屬性 id 和 model 的
model_id:當(dāng)前的動(dòng)作是在哪個(gè)模型上運(yùn)行的
binding_model_id:綁定的模型,當(dāng)前動(dòng)作將會(huì)出現(xiàn)在綁定的模型的視圖中
state:服務(wù)器動(dòng)作的類型,總共有 4 種可選的類型,分別是 code(執(zhí)行 Python 代碼),object_create(創(chuàng)建一條新記錄),object_write(更新記錄),multi(執(zhí)行多個(gè)動(dòng)作)
code:對(duì)應(yīng) state 的類型 code,為當(dāng)前動(dòng)作運(yùn)行時(shí)所要執(zhí)行的 Python 代碼
大家應(yīng)該都留意到了在上面的定義中出現(xiàn)了一個(gè)屬性 ref,如果我沒有理解錯(cuò),它應(yīng)該是 reference 的縮寫,它的值是一個(gè)外部 ID(external id),我們上面定義的這個(gè)動(dòng)作的外部 ID 就是定義時(shí)添加的 id 屬性的值 action_mark_todo_task_done,它指向一條具體的記錄(就像 Many2one 字段一樣)。
我們定義的所有模型都會(huì)在 ir.model.data 對(duì)應(yīng)的表中存在相應(yīng)的記錄,這些模型的外部 ID 形如 model_model_name,其中 model_name 是將模型名 [model.name](http://model.name) 的 . 替換成 _,例如我們的 todo.task 模型的外部 ID 就是前綴 model_ 加上 todo_task 組成的 model_todo_task 了。
接下來我們?cè)倏吹阶侄?code 里面的內(nèi)容,在這里面我們有一些變量是可以直接使用的:
env:Odoo 的運(yùn)行環(huán)境
model:動(dòng)作觸發(fā)時(shí)對(duì)應(yīng)的 Odoo 模型實(shí)例
record:動(dòng)作觸發(fā)時(shí)對(duì)應(yīng)的單個(gè)記錄(如在表單視圖中運(yùn)行對(duì)應(yīng)當(dāng)前表單所指向的記錄),可能是空的
records:動(dòng)作觸發(fā)時(shí)對(duì)應(yīng)的記錄集(如在列表視圖中勾選多條記錄觸發(fā),記錄集指向這些選中的記錄),可能是空的
Python 庫(kù):time, datetime, dateutil, timezone 時(shí)間相關(guān)的 Python 庫(kù)
log:用來記錄日志信息
Warning:通過 raise Warning("xxxxx") 拋出警告信息
除了上述可以直接使用的變量外,還有一個(gè) action 變量,當(dāng)我們想讓當(dāng)前動(dòng)作執(zhí)行完畢之后,返回一個(gè)新的動(dòng)作繼續(xù)執(zhí)行,就可以將返回的動(dòng)作的定義(一個(gè)字典)賦值給變量 action,客戶端將會(huì)自動(dòng)執(zhí)行該動(dòng)作。
OK, 前面說了這么多,我們更新一下代碼,然后刷新瀏覽器看看效果吧:
在列表視圖中,當(dāng)我們勾選了任意的記錄后,將會(huì)出現(xiàn)一個(gè)「動(dòng)作」菜單,打開之后就可以看到我們剛剛定義的「標(biāo)記完成」這個(gè) Server Action 了,試試看執(zhí)行會(huì)發(fā)生什么,注意觀察「已完成?」這一列的變化。然后再創(chuàng)建一條新的記錄,在表單頁(yè)面中,同樣有「動(dòng)作」菜單,我們?cè)谶@里也可以執(zhí)行「標(biāo)記完成」的動(dòng)作,怎么樣,是不是比原本的編輯再勾選再保存要方便得多了,而且我們還能在列表里勾選多條記錄進(jìn)行批量操作,不能更方便了!
受限于篇幅,我們這里只涉及了 state 為 code 類型的服務(wù)器動(dòng)作,相對(duì)其他三種類型,已經(jīng)足以應(yīng)付絕大多數(shù)場(chǎng)景的需求了,這里就不展開細(xì)說,感興趣的同學(xué)可以看看官方模塊的相關(guān)實(shí)現(xiàn),要學(xué)會(huì)看源碼哈!
URL 動(dòng)作URL Action 用來打開一個(gè)網(wǎng)頁(yè)鏈接,十分簡(jiǎn)單的一種動(dòng)作類型:
打開谷歌 new https://google.com
上面這個(gè)動(dòng)作觸發(fā)后將會(huì)新開瀏覽器窗口(或新標(biāo)簽)打開谷歌首頁(yè),主要的兩個(gè)字段如下:
target:有兩個(gè)可選值,分別是新窗口(new)打開鏈接,相當(dāng)于 ,以及當(dāng)前窗口(self)打開,相當(dāng)于
url:要打開的目標(biāo)頁(yè)面的鏈接,可以是外部頁(yè)面也可以是同域下的內(nèi)部頁(yè)面
客戶端動(dòng)作觸發(fā)一個(gè)完全由客戶端(瀏覽器)執(zhí)行的動(dòng)作,例如某些模塊的「儀表板」就屬于 Client Action,它的基本組成如下:
Dashboard backend_dashboard
上面這個(gè) Client Action 是在 Odoo 自帶模塊 website 中定義,用來打開儀表板,來看看客戶端動(dòng)作有哪些字段是可用的:
tag:客戶端動(dòng)作的標(biāo)識(shí),需要是在 action_registry 中注冊(cè)了的動(dòng)作
target:同窗口動(dòng)作
context:同窗口動(dòng)作
params:傳遞給客戶端動(dòng)作的參數(shù),一個(gè)字典
客戶端動(dòng)作的本體實(shí)際上是 tag 所指向的動(dòng)作,這個(gè)動(dòng)作是用 JS 編寫的一些邏輯(在 Odoo 的 JS 框架下),在之后會(huì)有專門的教程教大家相關(guān)的內(nèi)容,這里請(qǐng)先略過。
報(bào)表動(dòng)作這類型的動(dòng)作用于觸發(fā)報(bào)表打印,例如打印發(fā)票等。這里不對(duì)該類型作介紹,感興趣的同學(xué)同樣可以去看看 Odoo 自帶的一些模塊如 account 等。
瞎說幾句在實(shí)際開發(fā)中,最常接觸和使用的動(dòng)作基本上就窗口動(dòng)作(ir.actions.act_window)和服務(wù)器動(dòng)作(ir.actions.server)這兩種了,其中 Server Action 最復(fù)雜也最強(qiáng)大,可以用它來實(shí)現(xiàn)很多的功能。
上面沒有展開細(xì)說的內(nèi)容,希望大家可以多多翻看官方模塊的實(shí)現(xiàn),學(xué)會(huì)閱讀源碼才是最好的學(xué)習(xí)方式。
教程中的代碼會(huì)更新在 GitHub 倉(cāng)庫(kù)「Odoo-Tutorial-Demo」中,如果遇到什么問題,歡迎提出,我會(huì)及時(shí)解答 ;-)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42482.html
摘要:雖然這是個(gè)很簡(jiǎn)單的應(yīng)用,但是希望大家可以動(dòng)手一起操作,從最簡(jiǎn)單的開始上手學(xué)習(xí)如何使用這個(gè)框架。則是在和之間,負(fù)責(zé)響應(yīng)用戶操作,從中獲取數(shù)據(jù)進(jìn)行處理并返回到中。 showImg(https://segmentfault.com/img/bV66tE?w=728&h=410); 在第一篇教程發(fā)布之后差不多一個(gè)月的今天,終于完成了第二篇內(nèi)容,這個(gè)發(fā)布周期拖得實(shí)在是有點(diǎn)太長(zhǎng)了,我都覺得不好意思...
摘要:現(xiàn)在我們來給待辦事項(xiàng)增加一個(gè)緊急程度的字段,用來表示當(dāng)前任務(wù)的優(yōu)先級(jí)。此處我們還給這個(gè)字段添加了默認(rèn)值,表示當(dāng)一個(gè)待辦事項(xiàng)被創(chuàng)建后,如果沒有指定緊急程度,將默認(rèn)是待辦狀態(tài)。這篇教程中的代碼同樣會(huì)更新在我的倉(cāng)庫(kù)中。 showImg(https://segmentfault.com/img/bVbfv3E?w=1330&h=912); 在這篇教程里我們將會(huì)了解到 Odoo 模型里的一些其他...
摘要:今天這個(gè)系列教程即將迎來它的最后一篇內(nèi)容了,我們將要來學(xué)習(xí)中權(quán)限相關(guān)的內(nèi)容。在的權(quán)限管理體系中,同樣也有用戶組這一概念的存在,和其他框架如可以說大同小異。通常和權(quán)限相關(guān)的內(nèi)容,我們都會(huì)在模塊的目錄下進(jìn)行定義,記錄集規(guī)則的定義自然也不例外。 在今年的情人節(jié)(2018.02.14)那天,我寫了一篇博客說即將要開一個(gè)坑,也就是大家在看的這個(gè)系列的教程。今天這個(gè)系列教程即將迎來它的最后一篇內(nèi)容...
摘要:在這一篇教程中,將會(huì)涉及到外鍵字段,可以將兩個(gè)模型關(guān)聯(lián)起來,然后很方便地獲取到對(duì)應(yīng)的數(shù)據(jù)。關(guān)聯(lián)字段這一小節(jié)里,我們會(huì)給待辦事項(xiàng)加上分類,并且這個(gè)分類可以讓用戶自己創(chuàng)建維護(hù)。今天這篇教程的內(nèi)容就先到這里了,教程中的代碼會(huì)更新在我的倉(cāng)庫(kù)中。 showImg(https://segmentfault.com/img/bVbfzvt?w=1280&h=795); 在這一篇教程中,將會(huì)涉及到外鍵...
摘要:在前面教程中,我們使用了兩種類型的視圖和今天我們將學(xué)習(xí)使用另一種類型的視圖搜索視圖。大家可以試試看同時(shí)應(yīng)用多個(gè)分組,或者將分組和過濾器組合使用,仔細(xì)觀察和思考產(chǎn)生的結(jié)果。還是老規(guī)矩,教程中的代碼會(huì)更新在倉(cāng)庫(kù)中。 showImg(https://segmentfault.com/img/bVbgO85?w=1950&h=1300); 在前面教程中,我們使用了兩種類型的視圖——TreeVi...
閱讀 1263·2021-11-25 09:43
閱讀 2000·2021-11-11 10:58
閱讀 1238·2021-11-08 13:18
閱讀 2749·2019-08-29 16:25
閱讀 3549·2019-08-29 12:51
閱讀 3349·2019-08-29 12:30
閱讀 784·2019-08-26 13:24
閱讀 3720·2019-08-26 10:38