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