摘要:現在我們來給待辦事項增加一個緊急程度的字段,用來表示當前任務的優先級。此處我們還給這個字段添加了默認值,表示當一個待辦事項被創建后,如果沒有指定緊急程度,將默認是待辦狀態。這篇教程中的代碼同樣會更新在我的倉庫中。
在這篇教程里我們將會了解到 Odoo 模型里的一些其他類型的字段和特殊機制,而我依然會繼續帶領大家一起完善我們的 Todo 應用,不斷地往里面添加一些新的功能特性,讓它看起來更豐滿也更實用一些。
選擇字段在上一篇教程中,我們已經創建好了待辦事項的模型,但是只是添加了「描述」和「已完成?」兩個字段,這肯定是不能滿足我們的需求的。現在我們來給待辦事項增加一個「緊急程度」的字段,用來表示當前任務的優先級。
# models.py class TodoTask(models.Model): _name = "todo.task" _description = "待辦事項" name = fields.Char("描述", required=True) is_done = fields.Boolean("已完成?") priority = fields.Selection([ ("todo", "待辦"), ("normal", "普通"), ("urgency", "緊急") ], default="todo", string="緊急程度")
我們添加了一個 Selection 類型的字段 priority,并且指定了三個可供選擇的程度類型,一般情況下,如果一個字段只有固定的幾種可選值,通常都會選擇使用 Selection 字段,它接受一個元組列表作為參數,其中元組的組成為 (value, string),左邊的是數據庫中存儲的值,右邊的是一個用于界面顯示的描述。
此處我們還給這個字段添加了默認值 todo,表示當一個待辦事項被創建后,如果沒有指定緊急程度,將默認是待辦狀態。我們可以為任意類型的字段添加默認值。
在上一篇教程中我們提到過,在對模型進行改動之后,需要對模塊進行升級才能看到變更后的樣子,除了從應用列表中找到模塊進行升級外,我們還可以在命令行中給 Odoo 的啟動命令加上參數 -u todo 指定升級 todo 模塊。
./odoo-bin --addons-path=addons,../mymodules --db-filter=^demo$ -d demo -u todo
升級后創建或打開任意一條待辦事項進入到表單頁面,就可以看到已經多了「緊急程度」這個字段了,并且默認選擇了「待辦」這一狀態。
日期字段我們已經給待辦事項加上緊急程度了,可是光有這個還不夠,我們還要給它加上截止時間,畢竟 deadline 是第一生產力呀!
# models.py deadline = fields.Datetime(u"截止時間")
我們把截止日期也放到 TreeView 中,方便查看各個任務的 deadline
計算字段與視圖裝飾器
很多時候我們會需要用不同的顏色對待辦事項進行標記,例如我們會希望已經過期的任務以紅色標記來提醒我們,這個任務過期了。任務是否已經過期,我們要先知道任務的截止時間(上面一小節已經加上了)和當前時間,然后進行比較判斷任務的截止時間是否小于當前時間,如果是則表示任務已經過期了,我們需要在視圖上用紅色將對應的任務標記起來。那將這個需求轉化成代碼應該怎么做呢?
這個需求跟時間有關,并且時間是流動(一直在變化)的,所以我們應該要有一個方法在用戶每次打開待辦事項之前,把這個結果計算好,并且反饋給用戶,還好 Odoo 的 ORM 已經為我們實現了相關的機制——計算字段(Computed fields)
# models.py is_expired = fields.Boolean(u"已過期", compute="_compute_is_expired") @api.depends("deadline") @api.multi def _compute_is_expired(self): for record in self: if record.deadline: record.is_expired = record.deadline < fields.Datetime.now() else: record.is_expired = False
計算字段其實和其他字段一樣,只不過多了一個 compute 屬性,它的值是計算這個字段值的方法名。我們來看一下對應的方法 _compute_is_expired 頭頂上的 @api.depends 這個裝飾器,它接受了一個參數 deadline,表示的是 is_expired 這個字段的計算會用到 deadline 這個字段的值(我們需要用它的值和當前時間進行比較),如果一個計算字段會用到多個其他字段的值,這里就需要以逗號分隔,將用到的值的字段名依次傳入裝飾器中。
而 @api.multi 則表示該方法中的 self 是一個記錄集(多個實例的集合),如果不理解,可以暫時不深究,到后面自然會知道這里的實際用法。
再來看看實際的計算邏輯部分,只有一個循環以及一條賦值語句,剛剛已經提到過這里的 self 表示一個記錄集,我們需要對這個記錄集里的每一條記錄進行計算,判斷這個待辦事項是否已經過期,這里的 record 就是每一條記錄的實例對象,我們用這條記錄的 deadline 的值和當前時間 fields.Datetime.now() 進行比較,然后將結果賦值給字段 is_expired,就是這么簡單。
PS: 這里我們對 deadline 進行了判斷,是因為如果沒有設置截止時間,又或者是在新建代辦事項時,這里的 deadline 會是一個布爾值,是不能和時間字符串進行比較的。
其中大家可能會有疑問的應該是當前時間的獲取,為什么不是用 datetime.now() 吧?實際上獲取當前時間用的也是這個方法,只不過 Odoo 的 ORM 替我們封裝了一層,fields.Datetime.now() 是類 Datetime 的靜態方法:
# fields.py class Datetime(Field): type = "datetime" column_type = ("timestamp", "timestamp") column_cast_from = ("date",) @staticmethod def now(*args): """ Return the current day and time in the format expected by the ORM. This function may be used to compute default values. """ return datetime.now().strftime(DATETIME_FORMAT)
好的,這里先不過多糾結細節問題,現在我們已經可以計算出來每個待辦事項是否已經過期了,那要怎么去用這個計算字段呢?我們打開視圖文件來加點東西上去:
在視圖中我們把 is_expired 字段加了進去,并且還加上了屬性 invisible,這個屬性的作用是將當前字段隱藏起來,因為這里我們不希望用戶看到這個字段的值,而是將結果反映在顏色上。然后我們再看到
今天這篇教程的內容就先到這里了,下一篇再繼續帶大家深入更多的內容。這篇教程中的代碼同樣會更新在我的 GitHub 倉庫中。
倉庫地址:Odoo-Tutorial-Demo
寫在最后距離上一次更新,已經過了好幾個月了,這段時間除了忙公司的事情,還額外在做一些別的東西,然后最近在開發一個小程序。一直很想抽空出來更新這個系列的教程,一邊又有很多事情在忙,拖更了實在是抱歉了!
如果你有任何的疑問,歡迎留言,我將會盡快給出答復,如果想要加群或者加好友,可以發送站內信給我,我會回復你微信號~
期待下一篇教程可以繼續和你們見面。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/42255.html
摘要:雖然這是個很簡單的應用,但是希望大家可以動手一起操作,從最簡單的開始上手學習如何使用這個框架。則是在和之間,負責響應用戶操作,從中獲取數據進行處理并返回到中。 showImg(https://segmentfault.com/img/bV66tE?w=728&h=410); 在第一篇教程發布之后差不多一個月的今天,終于完成了第二篇內容,這個發布周期拖得實在是有點太長了,我都覺得不好意思...
摘要:今天這個系列教程即將迎來它的最后一篇內容了,我們將要來學習中權限相關的內容。在的權限管理體系中,同樣也有用戶組這一概念的存在,和其他框架如可以說大同小異。通常和權限相關的內容,我們都會在模塊的目錄下進行定義,記錄集規則的定義自然也不例外。 在今年的情人節(2018.02.14)那天,我寫了一篇博客說即將要開一個坑,也就是大家在看的這個系列的教程。今天這個系列教程即將迎來它的最后一篇內容...
摘要:在這一篇教程中,將會涉及到外鍵字段,可以將兩個模型關聯起來,然后很方便地獲取到對應的數據。關聯字段這一小節里,我們會給待辦事項加上分類,并且這個分類可以讓用戶自己創建維護。今天這篇教程的內容就先到這里了,教程中的代碼會更新在我的倉庫中。 showImg(https://segmentfault.com/img/bVbfzvt?w=1280&h=795); 在這一篇教程中,將會涉及到外鍵...
摘要:大家好鴨,我又來更新啦還記得我們在第二篇教程中提到過的動作嗎,今天我們就來專門講講在中的,學習不同類型的動作對應的應用場景,并且在我們的應用中使用上其中一些類型的動作。報表動作這類型的動作用于觸發報表打印,例如打印發票等。 showImg(https://segmentfault.com/img/bVbhdTE?w=1471&h=845); 大家好鴨,我又來更新啦!還記得我們在第二篇教...
摘要:在前面教程中,我們使用了兩種類型的視圖和今天我們將學習使用另一種類型的視圖搜索視圖。大家可以試試看同時應用多個分組,或者將分組和過濾器組合使用,仔細觀察和思考產生的結果。還是老規矩,教程中的代碼會更新在倉庫中。 showImg(https://segmentfault.com/img/bVbgO85?w=1950&h=1300); 在前面教程中,我們使用了兩種類型的視圖——TreeVi...
閱讀 1777·2023-04-25 21:50
閱讀 2425·2019-08-30 15:53
閱讀 772·2019-08-30 13:19
閱讀 2751·2019-08-28 17:58
閱讀 2473·2019-08-23 16:21
閱讀 2706·2019-08-23 14:08
閱讀 1382·2019-08-23 11:32
閱讀 1446·2019-08-22 16:09