大多數(shù)框架一樣,odoo模型層也是 Odoo技術(shù)框架最核心的部分了。了解了它的編寫規(guī)則,可以說 Odoo的神秘面紗基本也會(huì)被掀開一半。
上面這是一段證書管理的 model 代碼,下面來詳細(xì)解釋下 model 層各個(gè)字段
01
創(chuàng)建模型
創(chuàng)建類繼承自 models.Model
_name : 創(chuàng)建 odoo模型內(nèi)部標(biāo)志符(數(shù)據(jù)表名稱,名稱以_連接存入數(shù)據(jù)庫),必須是全局唯一的
_description: 描述,方便用戶的模型記錄解釋
_inherit : 繼承 (設(shè)置繼承自另外那個(gè)表,可以進(jìn)行字段方法的添加修改)
02
字段類型
可以定義字段的類型
1.Char :
單行文本
name=fields.Char(string=u'單據(jù)編號(hào)')
2.Text :
多行文本
note=fields.Text(u'備注')
3.Html:
存儲(chǔ)為帶格式的文本字段
html=fields.Html()
4.Datetime:
日期時(shí)間類型
date_order=fields.Datetime(string=u'訂單日期')
5.Date
delivery_date=fields.Date(u'交貨日期')
6.Selection:
下拉選擇列表(前一個(gè)參數(shù)是存儲(chǔ)在數(shù)據(jù)庫的值,后一個(gè)參數(shù)是前端展示的描述)
type=fields.Selection([ (u'default', u'默認(rèn)')], string=u'類型', default=u'default')
7.Boolean:
布爾類型
active=fields.Boolean(default=True, string=u'是否歸檔')
8.Integer:
整型
sequence=fields.Integer(string=u'排序', default=10)
9.Binary:
存儲(chǔ)為二進(jìn)制文件
files=fields.Binary(u'文件',filters='*.xlsx', required=True)
10.Float:
浮點(diǎn)型
amount=fields.Float(string=u'總計(jì)')
11.Monetary:
與浮點(diǎn)型類似,但帶有貨幣的特殊處理
price_subtotal=fields.Monetary(compute='_compute_amount', string=u'小計(jì)', readonly=True)
12.Many2one:
多對(duì)一
order_id=fields.Many2one('sale.order', string=u'銷售訂單', ondelete='cascade', index=True, copy=False)
13.One2many:
一對(duì)多
One2many 是一個(gè)一對(duì)多的關(guān)聯(lián)字段,與 Many2one 對(duì)應(yīng)
order_line=fields.One2many('sale.order.line', 'order_id', string=u'銷售明細(xì)',states=READONLY_STATES,copy=True)
14.Many2many:
多對(duì)多
一本書可以有多個(gè)作者,一個(gè)作者可以有多本書class Book(models.Model):
author_ids=fields.Many2many(‘res.partner’, string=‘Authors’)
class Partner(models.Model):
book_ids=fields.Many2many(‘library.book’, string=‘Authored Books’)
03
字段屬性
# string 字段顯示名label,任意字符串
# help='str' 用于懸掛幫助信息提示
# readonly=True 本字段是否只讀,缺省值:False
# required=True 本字段是否必須的,缺省值:False。
# index=True 設(shè)置字段創(chuàng)建索引
# select=True 相關(guān)聯(lián)字段下拉列表
# default 設(shè)置字段的默認(rèn)值
name=fields.Char(default="Unknown")
user_id=fields.Many2one('res.users', default=lambda self:self.env.user)
# states 定義特定state才生效的屬性,格式為:{'name_of_the_state': list_of_attributes},
其中l(wèi)ist_of_attributes是形如[('name_of_attribute', value), ...]的tuples列表。
例子(參見account.transfer): 'partner_id': fields.many2one('res.partner', 'Partner',
states={'posted':[('readonly',True)]}),
# groups 設(shè)置權(quán)限組訪問可見,值為列表形式,元素是組的xml ids(也就是外部標(biāo)識(shí)符)
# copy=False 設(shè)置字段不能被復(fù)制,普通字段是True, 在 one2many是默認(rèn)是False
# oldname='field' 當(dāng)一個(gè)字段在新版本重命名了,指定老的字段,老的字段的數(shù)據(jù)會(huì)自動(dòng)拷貝到新的字段中
# compute 給定一個(gè)方法名計(jì)算出該字段
# inverse 給定一個(gè)方法名反轉(zhuǎn)該字段 (為了在計(jì)算字段設(shè)置值)
document=fields.Char(compute='_get_document', inverse='_set_document')
def _get_document(self):
for record in self:
with open(record.get_document_path) as f:
record.document=f.read()
def _set_document(self):
for record in self:
if not record.document: continue
with open(record.get_document_path()) as f:
f.write(record.document)
# search 給定一個(gè)方法名搜索該字段 (用在計(jì)算字段)
upper_name=field.Char(compute='_compute_upper', search='_search_upper')
def _search_upper(self, operator, value):
if operator=='like':
operator='ilike'
return [('name', operator, value)]
# store 設(shè)定該字段是否存在數(shù)據(jù)表中,在用了compute時(shí)為False ,其它默認(rèn)是True
# compute_sudo 設(shè)定是否要超級(jí)用戶來計(jì)算該字段,默認(rèn)是False
# related 序列的字段名,用于關(guān)聯(lián)字段,默認(rèn)不存數(shù)據(jù)表中,可以store=True來存,
nickname=fields.Char(related='user_id.partner_id.name', store=True)
這里看出前面定義了user_id字段,這里是接著關(guān)聯(lián)到 user_id這個(gè)字段把所要的信息提取出來
# company_dependent 定義該字段是不是公司依賴
# change_default 別的字段的缺省值是否可依賴于本字段,缺省值為:False。
例子(參見res.partner.address) 'zip': fields.char('Zip', change_default=True, size=24),
這個(gè)例子中,可以根據(jù)zip的值設(shè)定其它字段的缺省值,例如,可以通過程序代碼,
如果zip為200000則city設(shè)為“上海”,如果zip為100000則city為“北京”。
# domain: 域條件,缺省值:[]。在many2many和many2one類型中,字段值是關(guān)聯(lián)表的id,
域條件用于過濾關(guān)聯(lián)表的record。例子: 'default_credit_account_id': fields.many2one('account.account',
'Default Credit Account', domain="[('type','!=','view')]"),
本例表示,本字段關(guān)聯(lián)到對(duì)象('account.account')中的,type不是'view'的record。
# context 上下文
# invisible: 本字段是否可見,即是否在界面上顯示本字段,缺省值True。
# selection: 只用于reference字段類型,參見前文reference的說明。
# size 只用于Char 設(shè)置可最大接收字符數(shù)
# translate=true 用于Text Char Html 本字段值(不是字段的顯示名)是否可翻譯,缺省值:False。
# ondelete 用于關(guān)聯(lián)字段,定義刪除方式
# manual
# deprecated=True 當(dāng)用這個(gè)字段,日志會(huì)記錄警告,主要是版本升級(jí)一些過渡字段
# password="True" 密碼星號(hào)顯示
# nolabel="1" 隱藏標(biāo)簽
# attr屬性 可以定義多條件這段只讀顯示
# digits 格式化浮點(diǎn)數(shù)
<field digits="(14,3)" name="volume" attrs="{readonly:[('type','=','service')]}"
# default_focus 新開窗口光標(biāo)位置
# Widget 多種部件顯示格式 widget="one2many_list"
one2one_list, one2many_list, many2one_list, many2many,Url,Email,Image,float_time,reference
04
ORM裝飾器
@api.multi
默認(rèn)裝飾器,如果我們需要自定義方法來對(duì)記錄集執(zhí)行一些操作。用這個(gè),方法的邏輯通常包括對(duì) self 的遍歷
@api.one
用于操作單條記錄(單例),棄用了。用@api.multi,在代碼頂部添加一行 self.ensure_one(),來確保操作單條記錄
@api.model
類靜態(tài)方法,self作為模型的引用,無需包含實(shí)際記錄。注意,不能從用戶界面中的按鈕使用這種類型的方法。
@api.onchange(‘字段值')
當(dāng)用戶編輯指定字段值時(shí),立即執(zhí)行一段業(yè)務(wù)邏輯。可用于執(zhí)行驗(yàn)證,向用戶顯示消息或修改表單中的其他字段
@api.depends(field1,...)
用于計(jì)算字段函數(shù),用于確保(重新)計(jì)算改變被觸發(fā)
@api.constrains(field1,...)
用于驗(yàn)證函數(shù),用于確保哪些約束生效被觸發(fā)
以上~
隨著企業(yè)信息化不斷地深入和應(yīng)用,無論大中小型企業(yè),通過信息化甚至數(shù)智化,不斷提高企業(yè)內(nèi)部的運(yùn)營(yíng)效率,人財(cái)物達(dá)到最優(yōu)配置,從而不斷增加企業(yè)核心競(jìng)爭(zhēng)力,有些行業(yè)領(lǐng)先的企業(yè),要求管理層必須懂IT,一崗雙責(zé),否則就無法勝任現(xiàn)有管理崗位,全員信息化或數(shù)字化。特別對(duì)于制造企業(yè)來說,業(yè)務(wù)隨著外部市場(chǎng)的變化也隨時(shí)需要更新升級(jí)系統(tǒng),以符合最新的企業(yè)管理模式,從系統(tǒng)開發(fā)角度來說,如何隨需而變并進(jìn)行快速響應(yīng)用戶的需求,這個(gè)是一個(gè)現(xiàn)實(shí)又重要的課題,通過Odoo可以很好地支持業(yè)務(wù)隨時(shí)變化的需求,由于Odoo配置功能很強(qiáng)大,完成可以作為企業(yè)內(nèi)部的低代碼開發(fā)平臺(tái),筆者后續(xù)會(huì)針對(duì)Odoo寫一系列的文章進(jìn)行一些經(jīng)驗(yàn)和實(shí)踐的分享。
什么是Odoo?Odoo由OpenERP發(fā)展而來,Odoo現(xiàn)在有一套完整的業(yè)務(wù)應(yīng)用,滿足所有的業(yè)務(wù)需求,從網(wǎng)站/電子商務(wù)到制造,庫存和會(huì)計(jì),所有的領(lǐng)域無縫集成。這是第一次一個(gè)軟件系統(tǒng),被設(shè)計(jì)成能達(dá)到這么全面的功能覆蓋。Odoo的底層結(jié)構(gòu)很強(qiáng)大,所有模塊都可以根據(jù)需要進(jìn)行安裝和御載,所以客戶能像搭積木一樣建構(gòu)自己期望的系統(tǒng)。即使完全不安裝與ERP相關(guān)的模塊,僅利用 Odoo 自身的底層框架,也能構(gòu)建出適合各種用途的系統(tǒng),純粹 B/S 架構(gòu)。而這一切都是免費(fèi)的,并且不受限于源代碼,也不受限于用戶數(shù)。
Odoo總部位于歐洲比利時(shí),擁有1700名員工,11個(gè)全球辦事處和超過700萬的全球用戶。過去10年,每年的增長(zhǎng)率超過50%。
Odoo的進(jìn)化史,如下:
2005, TinyERP 1.0(2月), 2.0(5月),3.0(9月),基于 GPL協(xié)議。GPL,是GNU General Public License的縮寫,是GNU通用公共授權(quán)非正式的中文翻譯,AGPL是GPL的一個(gè)補(bǔ)充, 在GPL的基礎(chǔ)上加了一些限制。
2006, TinyERP 4.0(9月),仍然是GPL協(xié)議
----------------------第一次改名-------------------------------------------------
2009 OpenERP 5.0(4月),第一次重大改進(jìn),歷時(shí)三年時(shí)間。
2011 OpenERP 6.0(1月), 基本web 的客戶端,協(xié)議從GPL變?yōu)锳GPL。
2012 OpenERP 6.2(2月), GTK客戶端停止開發(fā),引入Ajax。
2012 OpenERP 7.0(12 ), 增強(qiáng)了可用性。
------------------------第二次改名---------------------------------------------------
2014 Odoo 8.0(10月) 重寫了倉庫和WMS,引入了電商、POS、BI。
2015 Odoo 9.0(10月) 開啟社區(qū)版和企業(yè)版雙版本戰(zhàn)略,社區(qū)版免費(fèi),企業(yè)版按用戶收費(fèi) 費(fèi),LGPL協(xié)議。
2016 Odoo 10.0(10月) 重寫了 MRP模塊,引入 MPS\PLM 概念,企業(yè)版按用戶和模塊收費(fèi)。
2017 Odoo 11.0(10月) 重寫了 Report,重寫了Studio,支持Python 3,提升了速度和性能。
2018 Odoo 12.0(10月) 引入 物聯(lián)網(wǎng)盒子,機(jī)器學(xué)習(xí),報(bào)表設(shè)計(jì)器。
2019 Odoo 13.0(10月) 更強(qiáng)大的會(huì)計(jì)模塊,更令人驚嘆的網(wǎng)站設(shè)計(jì),更實(shí)用的在線學(xué)習(xí),更靈活地制造模塊管理。
2020 Odoo 14.0(10月) 從功能上來說,也確實(shí)在ERP核心功能之外的網(wǎng)站、電商、HR等方面有不少功能增添,同時(shí)引入了全新前端框架OWL。
2021 Odoo 15.0(10月) OWL表單2.0發(fā)布,電子表格實(shí)時(shí)提供ERP數(shù)據(jù)。公式助手、編輯欄、查找和替換等(企業(yè)版功能)。
Odoo 15是一系列開源商業(yè)應(yīng)用程序套裝,此套裝可滿足中小型企業(yè)的一切應(yīng)用需求,例如,企業(yè)基本的進(jìn)銷存、采購、銷售、MRP生產(chǎn)制造、品保質(zhì)量保障、企業(yè)招聘、員工合同、休假、午餐管理、內(nèi)部論壇、車隊(duì)管理、內(nèi)部聊天IM溝通、客訴追溯管理、CRM客戶關(guān)系管理、VOIP、E-Shop電子商務(wù)、網(wǎng)店、企業(yè)官方網(wǎng)站,財(cái)務(wù)會(huì)計(jì)、銀行對(duì)賬、資產(chǎn)管理、HR工資管理、預(yù)算管理、WMS倉庫庫存管理、POS街邊小攤、社區(qū)商店、項(xiàng)目管理、條碼、PLM等等。
從Odoo 11開始,定位不僅僅是開源ERP,已覆蓋到企業(yè)的CRM、PLM、WMS、HR等全領(lǐng)域,一個(gè)應(yīng)用滿足所有中小企業(yè)需求,ODOO的應(yīng)用界面,如下圖:
Odoo是基于開源技術(shù)進(jìn)行構(gòu)建的,數(shù)據(jù)庫采用開源老牌的數(shù)據(jù)庫Postgresql,開發(fā)語言基于目前主流的Python等一系列開源技術(shù)和產(chǎn)品,并構(gòu)建成熟穩(wěn)定的架構(gòu),提供了強(qiáng)大的配置,定制和在線開發(fā)工具,確保通用化產(chǎn)品和靈活定制之間的平衡。
PostgreSQL 的歷史簡(jiǎn)介:
PostgreSQL是一個(gè)功能強(qiáng)大的開源對(duì)象關(guān)系數(shù)據(jù)庫系統(tǒng),它使用并擴(kuò)展了SQL語言,并結(jié)合了許多安全存儲(chǔ)和擴(kuò)展最復(fù)雜數(shù)據(jù)工作負(fù)載的功能。PostgreSQL的起源可以追溯到1986年,作為加州大學(xué)伯克利分校POSTGRES項(xiàng)目的一部分,并在核心平臺(tái)上進(jìn)行了30多年的積極開發(fā)。
PostgreSQL憑借其經(jīng)過驗(yàn)證的架構(gòu),可靠性,數(shù)據(jù)完整性,強(qiáng)大的功能集,可擴(kuò)展性以及軟件背后的開源社區(qū)的奉獻(xiàn)精神贏得了良好的聲譽(yù),以始終如一地提供高性能和創(chuàng)新的解決方案。PostgreSQL在所有主要操作系統(tǒng)上運(yùn)行,自2001年以來一直是符合ACID標(biāo)準(zhǔn)的,并且具有強(qiáng)大的附加功能,例如流行的PostGIS地理空間數(shù)據(jù)庫擴(kuò)展器。毫無疑問,PostgreSQL已經(jīng)成為許多人和組織的首選開源關(guān)系數(shù)據(jù)庫。
開始使用PostgreSQL從未如此簡(jiǎn)單 - 選擇您想要構(gòu)建的項(xiàng)目,并讓PostgreSQL安全可靠地存儲(chǔ)您的數(shù)據(jù)。
Python:
1、 Python是一種計(jì)算機(jī)程序設(shè)計(jì)語言。是一種動(dòng)態(tài)的、面向?qū)ο蟮哪_本語言,最初被設(shè)計(jì)用于編寫自動(dòng)化腳本(shell),隨著版本的不斷更新和語言新功能的添加,越來越多被用于獨(dú)立的、大型項(xiàng)目的開發(fā)。
2、Python就為我們提供了非常完善的基礎(chǔ)代碼庫,覆蓋了網(wǎng)絡(luò)、文件、GUI、數(shù)據(jù)庫、文本等大量?jī)?nèi)容,被形象地稱作“內(nèi)置電池(batteries included)”。用 Python開發(fā),許多功能不必從零編寫,直接使用現(xiàn)成的即可。
3、除了內(nèi)置的庫外,Python還有大量的第三方庫,也就是別人開發(fā)的,供你直接使用的東西。當(dāng)然,如果你開發(fā)的代碼通過很好的封裝,也可以作為第三方庫給別人使用。
4、許多大型網(wǎng)站就是用Python開發(fā)的,例如YouTube、Instagram,還有國(guó)內(nèi)的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美國(guó)航空航天局)都大量地使用Python。
同時(shí)Odoo不僅具有10多年的發(fā)展歷史,Odoo官方每年都會(huì)發(fā)布更新一個(gè)大的全新版本,每次都會(huì)有很多新特性或新功能,而且具有強(qiáng)大的生態(tài)圈,目前Odoo官網(wǎng)的應(yīng)用商店已超過3萬+擴(kuò)展模塊插件,其中一半插件是完全免費(fèi)的,同時(shí)Odoo社區(qū)OCA也提供了很多免費(fèi)好用的插件,對(duì)于我來說,通過Odoo自帶的項(xiàng)目模塊,并通過下載一些項(xiàng)目相關(guān)的免費(fèi)插件,像搭積木一樣構(gòu)建了一個(gè)功能完整的項(xiàng)目管理系統(tǒng),同時(shí)項(xiàng)目管理相關(guān)的一些報(bào)表是通過開發(fā)實(shí)現(xiàn)的,其他基本都是通過配置實(shí)現(xiàn)。
Odoo價(jià)格優(yōu)勢(shì):
在帶寬和服務(wù)器硬件允許的情況下,社區(qū)版沒有使用用戶數(shù)的限制,客戶端不用額外安裝軟件只要用新版的chrome瀏覽器或者firefox瀏覽器即可。
對(duì)于生產(chǎn)和大多數(shù)企業(yè)來說,二次開發(fā)本來就不可避免,由于有大量預(yù)開發(fā)模塊,Odoo在二次開發(fā)的速度和價(jià)格上有非常大的優(yōu)勢(shì)。
即使金蝶,用友,Sap,甲骨文的ERP是免費(fèi)的,一旦你需要二次開發(fā),動(dòng)輒幾十萬幾百萬甚至上千萬的價(jià)格還是讓很多企業(yè)承受不起。
相對(duì)很多軟件使用微軟的sql,微軟的Server系統(tǒng)和操作系統(tǒng),微軟的office,這些軟件如果買正版,也是一筆不小的開銷。
很多企業(yè)雖然買了正版的用友,金蝶,但微軟的服務(wù)器系統(tǒng),微軟的數(shù)據(jù)庫都是盜版,這為以后埋下不少隱患。
而Odoo用的服務(wù)器系統(tǒng)是Ubuntu Server他目前是自由免費(fèi)的,PostgreSQL也是免費(fèi)的。
如果自己找團(tuán)隊(duì)去開發(fā)Odoo這樣一套系統(tǒng),估計(jì)至少20個(gè)人開發(fā)5年,也就是差不多至少300萬的開銷。
投資成本分析 | |||
傳統(tǒng)ERP項(xiàng)目 | Odoo企業(yè)版 | Odoo社區(qū)版 | |
咨詢培訓(xùn) | 數(shù)萬 | 低 | 低 |
軟件許可 | 10-100萬 | 每月12-72美元 | 免費(fèi) |
軟件升級(jí) | 3-30萬 | 無 | 無 或 低 |
年服務(wù)費(fèi) | 合同15-30% | 無 | 無 或 低 |
實(shí)現(xiàn) | 合同65% - 75% | 無 | 合同65% - 75% |
Odoo產(chǎn)品優(yōu)勢(shì):
Odoo的前端用了較多的Javascript代碼,這樣保證了用戶體驗(yàn)較好:輸入關(guān)鍵字即出現(xiàn)的產(chǎn)品及聯(lián)系人選項(xiàng),大大提高了操作速度,(有不少軟件都需要多操作一步搜索)。
非常強(qiáng)大的過濾及高級(jí)搜索功能 可以根據(jù)電話號(hào)碼地址等字段搜索,可以根據(jù)客戶或者產(chǎn)品來索引出此客戶或者產(chǎn)品的銷售情況,服務(wù)情況 。
方便查看各類單據(jù)了解產(chǎn)品的成本,售價(jià)的變化。比如可以顯示現(xiàn)有庫存量,查看產(chǎn)品的所有采購情況。
快速上線:不像其他軟件,必須弄很多初始數(shù)據(jù),有些初始數(shù)據(jù)比如產(chǎn)品名,會(huì)計(jì)期初帳OpenERP可以在后期慢慢弄,
更直觀的數(shù)據(jù):具有柱狀,餅狀,雷達(dá),曲線等 直觀的數(shù)據(jù)透視圖表顯示,有些模塊還具有甘特圖。
Odoo技術(shù)優(yōu)勢(shì):
B/S(瀏覽器-服務(wù)器)架構(gòu)(方便了更新和二次開發(fā)),跨操作系統(tǒng)方面很有優(yōu)勢(shì),平板,手機(jī)默認(rèn)都可以用。采用Module為開發(fā)單元,采用MVC的架構(gòu),支持繼承。B/S架構(gòu),支持各種操作系統(tǒng)和瀏覽器。
先進(jìn)的數(shù)據(jù)庫PostgreSQL,先進(jìn)的語言Python,大量的預(yù)開發(fā)代碼可以實(shí)現(xiàn)快速進(jìn)行二次開發(fā)。
可以部署在云端(企業(yè)可以自己建云,建立一個(gè)更大的數(shù)據(jù)庫)云計(jì)算特性很容易能把上下游整個(gè)供應(yīng)鏈的資源都整合到Odoo中來。(通過更改Odoo設(shè)置還可以開放客戶接口和供應(yīng)商接口)
內(nèi)置了社交系統(tǒng):消息系統(tǒng)。并在各個(gè)模塊都擁有非常靈活的搜索和高級(jí)搜索界面。
Odoo開源優(yōu)勢(shì):
幾十人的團(tuán)隊(duì)開發(fā)十多年(目前官方團(tuán)隊(duì)有1700多人,至少還大約有6000名志愿者參與,用戶數(shù)量超過700萬)。
模塊齊全,涵蓋了個(gè)人助理,企業(yè)內(nèi)部交流,客戶關(guān)系管理CRM,進(jìn)銷存管理,生產(chǎn)管理,人力資源管理等等(以8.0來說目前已有4000多個(gè)功能模塊已經(jīng)適合絕大多數(shù)企業(yè)),并且Odoo不斷的有新功能和新模塊來適應(yīng)更多的企業(yè)去運(yùn)用。
它還是個(gè)很好的二次開發(fā)的平臺(tái),如果你不需要其自帶的模塊,你完全可以按照官方模塊的寫法,寫自己的模塊。
流程設(shè)計(jì)合理,除了初始化的數(shù)據(jù)(產(chǎn)品,客戶,供應(yīng)商)及少數(shù)單據(jù)(報(bào)價(jià)單,銷售訂單),大部分單據(jù)(出入庫單,會(huì)計(jì)憑證)都是系統(tǒng)自動(dòng)生成,只需要對(duì)應(yīng)的人員進(jìn)行核查及確認(rèn)即可,大大降低了工作強(qiáng)度和出錯(cuò)幾率。
單據(jù)的流程可以根據(jù)企業(yè)的實(shí)際情況定制和修改,可以在系統(tǒng)里面改變工作流程滿足企業(yè)需求。
具有多語言,多幣種,對(duì)于貿(mào)易類企業(yè)OE現(xiàn)有的模塊基本可以滿足企業(yè)90%或更多的應(yīng)用需求。
雖然是開源軟件,Odoo8.0依然是個(gè)長(zhǎng)期支持的版本,基本每天都有更新,修復(fù)各種漏洞,截止2013年已經(jīng)有200萬用戶下載了Odoo。成功案例估計(jì)成千上萬其中不乏美國(guó)AT&T ,法國(guó)電信,達(dá)能集團(tuán)這樣的巨型公司。
請(qǐng)大家點(diǎn)擊左上角關(guān)注+評(píng)論,也歡迎私信跟我交流!
順便幫忙轉(zhuǎn)發(fā)一下
ir.actions.client 是odoo actions事件的一種,觸發(fā)一個(gè)在客戶端實(shí)現(xiàn)(即js文件中定義的函數(shù),通過core.action_registry.add(tag,函數(shù)名) 注冊(cè)到odoo中)動(dòng)作
在 項(xiàng)目目錄/static/src/js 建立 m_custome_list.js 文件
odoo.define('custom_page.demo', function (require) {
"use strict";
var AbstractAction=require('web.AbstractAction');
var core=require('web.core');
var CustomPageDemo=AbstractAction.extend({
// 對(duì)某個(gè)類關(guān)聯(lián)click事件
events: {'click .demo-submit': '_onSubmitClick',
'click .db_add_data': '_onAddData'},
// 初始化,可以在action 里傳入?yún)?shù)
init: function (parent, action, option) {
// 保存?zhèn)鬟f的參數(shù)
this.params=action.params;
this._super.apply(this, arguments);
},
// 渲染視圖
renderElement: function () {
this._super.apply(this, arguments);
// 渲染qwb 視圖,并傳值
this.$('.o_content').html(
core.qweb.render('DemoPage',
{'params':this.params}));
},
_onSubmitClick: function (e) {
e.stopPropagation();
alert('Submit clicked!');
},
// 添加一條數(shù)據(jù)
_onAddData: (e)=> {
e.stopPropagation();
window.alert('添加成功');
},
});
// add方法對(duì)動(dòng)作進(jìn)行注冊(cè),第一個(gè)參數(shù)表示注冊(cè)的動(dòng)作名,
第二個(gè)參數(shù)是要注冊(cè)的動(dòng)作對(duì)象;
core.action_registry
.add('custom_page.demo',CustomPageDemo);
return CustomPageDemo;
});
在 項(xiàng)目目錄/static/src/xml 建立 m_custome_list.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">
<t t-name="DemoPage">
<div style="margin:0 auto;
text-align:center;"class="o_content">
<table class="table table-striped">
<tr>
<th>標(biāo)題</th>
<th>內(nèi)容</th>
<th>創(chuàng)建日期</th>
</tr>
<t t-foreach="params.contentList" t-as="item">
<tr>
<td><t t-esc="item.title"/></td>
<td><t t-esc="item.content"/></td>
<td><t t-esc="item.date"/></td>
</tr>
</t>
</table>
<button type="button"
class="db_add_data btn btn-primary">增加數(shù)據(jù)</button>
</div>
</t>
</templates>
model 調(diào)用client方法, 在model關(guān)聯(lián)的xml視圖頁面,增加一個(gè)按鈕,綁定show_list方法,也可以在任何方法中返回client和返回actions.window 一樣
def show_list(self):
content_list=[
{'title': '內(nèi)容一', 'content': '我是內(nèi)容一一,
在想看看1', 'date': '2021-08-08'},
{'title': '內(nèi)容二', 'content': '我是內(nèi)容二二,
在想看看2', 'date': '2021-08-09'},
{'title': '內(nèi)容三', 'content': '我是內(nèi)容三三,
在想看看3', 'date': '2021-08-10'},
{'title': '內(nèi)容四', 'content': '我是內(nèi)容四四,
在想看看4', 'date': '2021-08-11'},
]
info={
'title': '測(cè)試列表循環(huán)',
'contentList': content_list
}
return {
'type': 'ir.actions.client',
'name': '列表信息',
'tag': 'custom_page.demo',
# custom_page.demo就是前面js中定義的事件名
'params': info,
'target': 'new',
}
在 項(xiàng)目目錄/views/ 建立 js_and_css.xml 文件, 用來加載自己寫的js,別忘了在mainfast.py 中加載這個(gè)js_and_css.xml
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<template id="assets_end"
inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script src="/customtree/static/
src/js/m_custome_list.js"
type="text/javascript"/>
</xpath>
</template>
</odoo>
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。