轉載請註明原文地址:http://www.javashuo.com/article/p-szcxdprp-kx.htmlhtml
一:模型前端
【Odoo中,一切皆模型,連視圖都是模型。Odoo將各類數據,如:權限數據、類數據、視圖數據等,按照模型分表存儲,而後在查看時,按照索引從各個表格讀取信息,組合成咱們看到的內容。】web
1:建立模型spring
模型屬性:模型類可使用一些屬性來控制它們的一些行爲:數據庫
_name :建立odoo模型的內部標識符,必含項。api
_description :當用戶界面顯示模型時,一個方便用戶的模型記錄標題。安全
_order :當瀏覽模型記錄或者顯示在列表視圖時,設置默認順序。服務器
_rec_name:用來指出引用關聯字描述記錄的字段,例如多對一關係。 默認狀況下,它使用name字段,這是模型中常見的字段。可是這個屬性容許咱們使用任何其餘字段來實現這個目的。session
_table:用來支持模型的數據庫表名。一般,它是左自動計算,是下劃線取代點的模型名稱,但也能夠設置特定的表名。數據結構
_inherit :繼承。
_inherits :嵌入式繼承。
模型深刻:
Odoo模型由Python類表示。
Odoo模型被保存在一箇中央註冊中心,它能夠引用實例中可用的全部模型類,而且它能夠被一個模型名引用。在咱們編寫的模型方法代碼中,能夠經過 self.env['x'] 獲取一個表明model x的類的引用。(至關於spring託管對象)
模型名稱很重要,由於它們是用於訪問註冊中心的。模型名稱的約定規則:用點分隔的小寫字母列表。
模型名稱必須是全局惟一的。正由於如此,第一個詞應該對應於該模塊涉及到的主要應用程序。
瞬態和抽象模型:
絕大多數Odoo模型中,類都是基於models.Model類的。 這種類型的模型具備永久的數據庫持久性:爲它們建立數據庫表,而且它們的記錄被存儲,直到被顯式刪除。
Odoo還提供了另外兩種模型類型:瞬態模型和抽象模型。
瞬態模型基於models.TransientModel類,用於嚮導式的用戶交互。 它們的數據仍然存儲在數據庫中,但指望是臨時的。 一個清理做業按期從這些表中清除舊數據。
抽象模型基於models.AbstractModel類,而且它不存儲數據。 抽象模型做爲可重用的功能集,利用Odoo的繼承功能,混入到其餘模型。
2:模型之間的關係
命名字段時,有如下約定:以_id、_ids爲結尾命名的字段,分別對應的是2one和2many的關係。
多對一關係:Many2one關係須要兩個參數:關聯模塊和展現字符。它會在數據庫表中建立一個擁有外鍵的字段去關聯數據庫表。其餘參數:
ondelete 在關聯的記錄被刪除時,將會觸發。默認值是null,也就是說,當關聯的記錄被刪除時,它將被置空。其它值爲restrict,當記錄被關聯時,禁止刪除,cascade,刪除關聯記錄的同時刪除當前記錄。
context是一個數據字典,在web客戶端視圖,經過關聯關係訪問時,會將上下文傳過去。好比,設置默認值。它的詳細的介紹,在第六章-視圖-設計用戶界面中。
domain是一個由多個元組組成的列表的域表達式,用來刪選關聯字段中有效的記錄。
auto_join=True使用這個參數後,將容許ORM在數據查詢是使用SQL的join(拼接,級聯)功能。
多對多關係:Many2many 最少要提供一個參數,也就是關聯的模塊,建議再使用string參數,以便更好的標題展現。
多對多關係的存儲:在數據庫層面,數據庫表中是不會添加任何字段。它會自動的建立一個新的中間表,這個表只有兩個外鍵ID字段,而且這兩個字段分別關聯對應的數據庫表。
一對多反向關係:One2many按順序接收3個參數:關聯的模塊,關聯模塊的字段名稱,標題文本。最開始的兩個參數一般是模塊名和相反關係對應的外鍵字段名。
分層關係:樹型存儲。
_parent_store = True
# _parent_name = 'parent_id'
parent_id = fields.Many2one('todo.task.tag', 'Parent Tag', ondelete='restrict')
parent_left = fields.Integer('Parent Left', index=True)
parent_right = fields.Integer('Parent Right', index=True)
#添加一個子記錄
child_ids = fields.One2many('todo.task.tag', 'parent_id', 'Child Tags')
3:計算字段
要建立計算字段,須要設置它的compute
屬性爲方法名。這個計算方法經過計算self
的每條記錄來設置字段的值。
注意
self
是一個記錄的有序集合,它支持標準的Python集合操做,如len(self)
和iter(self)
,加上額外的集合操做recs1 + recs2
。迭代過程逐個提供self
記錄,其中每一個記錄自己是大小爲1的集合。你能夠經過點記號來訪問/分配單個記錄上的字段record.name
。
計算字段就像常規字段同樣聲明,可是有額外的compute參數,參數值是一個函數名,在函數中計算值並返回。
字段= fields.XX(compute='函數名') @api.depends('參數') def 函數(self): 操做
當計算依賴於其餘字段時,須要@api.depends裝飾器。
計算字段的值一般取決於所在記錄行的其它字段的值。ORM層指望開發人員使用depends()
裝飾器來指定計算方法的依賴性。當某些依賴關係被修改後,ORM層經過給定的依賴關係來觸發字段的從新計算。
一種用法:統計一對多字段的長度,獲得關聯人數:
attendees_count = fields.Integer(string="Attendees count", compute='_get_attendees_count', store=True) @api.depends('attendee_ids') def _get_attendees_count(self): for r in self: r.attendees_count = len(r.attendee_ids) //根據關聯字段的長度,獲得出席人數
onchange:【onchange至關於前端的js函數!】
"onchange"機制爲客戶端界面提供了一種方法:當用戶在字段中填寫了值,不須要向數據庫保存任何內容,就能夠更新表單。
例如,假設模型有三個字段amount
,unit_price
和price
,當數量和單價改變時,自動從新計算價格,並在表單界面更新。要實現這個需求,須要定義一個方法,並使用onchange()
裝飾器,onchange()
的參數指定了在那個字段改變時,觸發方法。其中self
表明表單視圖中的記錄,你所作的任何更改,self
都將馬上反應在表單上。
onchange也能夠用於檢測字段變化值是否合法。
搜索與寫入:
計算字段能夠經過計算獲得字段值,但此時只能被讀取顯示,還不能被搜索或者寫入。爲此,咱們須要實現函數,並經過字段的search參數、inverse參數來實現該字段的搜索與寫入定義。
字段= fields.XX( string='展現名', compute='計算函數', search='搜索函數', inverse='寫入函數') def 搜索函數(self, 參數): return [('搜索條件', operator, value)]
def 寫入函數(self): self.字段 = self.寫入值
存儲計算字段:經過設置「store= true」的定義,計算字段的值也能夠存儲在數據庫中。
4:關聯字段
字段 = fields.XX( related='關聯模型.關聯字段', string='展現名')
5:模型約束
Python約束檢查函數應該使用@api.constraints(被約束字段) 修飾,說明被檢查的字段的列表。當其中任何一個被修改,而且在條件失敗時將會拋出一個異常,驗證就會被觸發。
@api.constrains('字段名') def 驗證函數(self): if 條件: raise ValidationError('驗證錯誤信息!')
6:self.env
self.env 對象給出了訪問請求參數和其餘有用的信息: self.env.cr 或者 self._cr是數據庫遊標對象,一般用於查詢數據庫 self.env.uid或者self._uid是當前用戶的數據庫ID self.env.user是當前用戶記錄 self.env.ref(xml_id)返回XML ID對應的記錄 self.env[model_name]返回給定模型的實例
二:視圖
用戶界面的每一個組件都以記錄的形式存儲在數據庫中,模塊從XML文件加載相應的數據時會向數據庫添加UI元素,而後odoo從數據庫讀取UI元素進行顯示。
菜單項:
<menuitem>快捷元素,提供了一種縮減方式來定義要加載的記錄,咱們可使用它來代替<record model =「ir.ui.menu」>元素。
頂級菜單項:只有id和name屬性。
子菜單項:經過parent =「上層菜單id」屬性置於上層菜單下。
菜單動做:經過action =「act_window」屬性,把點擊菜單的動做指定爲act_window中打開某個視圖(如tree/form)
菜單分組:使用groups屬性使其僅對某些安全組可見。
窗口動做:
給出GUI客戶端指令,一般供視圖中的菜單項或按鈕調用。
它告訴GUI應該使用什麼模型,以及提供哪些視圖。 這些操做可使用domain過濾器強制只有一部分記錄可見。 他們還能夠經過context屬性設置默認值和過濾器。
窗口動做存儲在ir.actions.act_window模型中,可使用<act_window>快捷標籤在XML文件中定義。
主要屬性有:
name:經過此操做打開的視圖中顯示的標題。 res_model:目標模型的標識符ID view_mode:要打開的視圖類型和它們的順序。 第一個是默認打開的。 target:若是設置爲new,將在彈出的對話框窗口中打開視圖。 默認值爲current,在主內容區域中打開視圖。 context:設置關於目標視圖的上下文信息,上下文中能夠設置默認值或激活過濾器以及其餘信息。 domain:域表達式,強制過濾在打開的視圖中可瀏覽的記錄。 limit:列表視圖中每一個頁面的記錄數。
src_model:應該在什麼模型上此動做可用。
multi:當設置爲True時,使它在列表視圖中可用,以便它能夠應用於多條選中的記錄。 默認值爲False。
上下文與域:
context屬性值:上下文是一個包含session數據的字典,它能夠被客戶端的用戶接口和服務器端的ORM與業務邏輯使用。
在客戶端,它能夠將信息從一個視圖傳輸到另外一個視圖。在服務器端,一些記錄的字段值能夠經過上下文被本地設置提供。
domain表達式:域被用來篩選數據記錄。它們使用特殊的語法,以便於Odoo ORM 將它們解析後生成對應的SQL WHERE數據庫篩選語句。
域表達式是一個條件列表,每一個條件是一個形如('field_name', 'operator', value')的元組。
filed_name 是須要篩選的字段,它可使用點(.)來訪問關係模塊的字段。 value 是一個Python表達式的值。它可使用字符值,好比:字符串,數字,布爾值,或則列表、某個字段、用戶在context中自定義的有效的值。 operator 能夠爲: 經常使用的操做符:<,>,<=,>=,=,!=。 '=like'通配符,使用下劃線(_)時,匹配一個任意字符,使用百分號(%)時,匹配多個字符。 'like'匹配一個’%value%’的字符串。’ilike’與此相似但不區分大小寫。‘not like’和‘not ilike’也可使用 'child of'在層級關係中,篩選子集 'in'和’not in’篩選是否在一個列表裏面,因此,給的值應該是個list。當在’to-many’的關係字段中,‘in’的做用和contains的做用同樣
domain表達式是一個包含多項內容的list,所以,能夠包含多個條件表達式元組。 默認狀況下(隱含),這些條件之間是用AND邏輯符鏈接的,也就是說,它只返回知足全部條件的記錄集。
也能夠用顯式的邏輯鏈接符:and鏈接符(&,默認使用),或鏈接符(|)。這些鏈接符後面跟着兩項內容,能夠畫成遞歸樹的形式理解。
感嘆號(!),是非操做符(NOT),做用於緊挨它的後一個項。所以,它應該出如今否認項的前面。好比,['!', ('is_done','=',True)]
['|', ('message_follower_ids', 'in', [user.partner_id.id]), '|', ('user_id', '=', user.id), ('user_id', '=', False)]
畫成遞歸樹:
窗體視圖:form視圖
Header頭部:header區域通常用於展現文檔流轉的階段和生命週期,以及動做按鈕。
文檔生命週期經過狀態欄小控件呈現當前所處的狀態.這些一般是狀態選擇字段或者多對一的階段字段。
狀態是一個選擇列表,呈現的是過程當中有幾個至關穩定的步驟階段,例如:新建、處理中、完成。
操做按鈕通常爲表單按鈕,最重要的階段可使用class=「oe_highlight」突出顯示。
Sheet區域:
標題:在group以外,咱們可使用html基本元素來制定標題,如:div,span,H1,和H2等。
分組:<newline>將強制生成一個新行。附加部分標題可使用<separator>元素添加到組內。使用col和colspan屬性,咱們能夠更好的控制組元素佈局。col屬性能夠指定組中包含的列數,默認值是2,它也能夠改成任何數字,雙數的效果更好,由於每個字段加起來都要兩列。組內元素,包括<field>元素,可使用colspan屬性設置一個特定的列數,默認都是一列。
分頁筆記本:筆記本元素能夠包含多個標籤的部分,稱爲頁面。能夠實現按頁切換輸入、顯示。
<notebook> <page string="顯示文字" name="頁名"> 內容... </page> <page> ... </page> </notebook>
語義組件:
視圖標籤屬性:
name:標識字段數據庫名稱
string:標籤文本,若是咱們想要覆蓋模型定義提供的標籤文本,可使用它。
help:提示文本,當您將指針懸停在字段上時,將顯示一個提示文本,並容許覆蓋模型定義提供的幫助文本。
placeholder:是一個建議文本,顯示在該字段內。
widget:容許咱們覆蓋用於該字段的缺省小部件。
options:是一個JSON數據結構,爲小部件提供了額外的選項,而且取決於每一個小部件支持什麼。
class:是用於字段HTML呈現的CSS類。
nolabel="True":防止自動字段標籤被呈現。僅對<group>元素中的字段有意義,而且常常和<label for="..."> 元素一塊兒使用.
invisible="True":使字段不可見,可是數據是從服務器獲取的,而且在表單上可用。
readonly="True": 使表單上的字段不可編輯。
required="True" 在表單上字段爲必需字段。
某些字段類型的特殊屬性:
password="True":用於文本字段。它顯示爲一個密碼字段,屏蔽輸入的字符。
filename: 用於二進制字段,它是用於存儲上傳文件名稱的模型字段名稱。
mode:用於一對多字段。它指定用於顯示記錄的視圖類型。默認狀況下,它是樹,但也能夠是表單、看板或圖形。
小部件(widget屬性值):
對於文本字段,咱們有如下小部件:
email:是用來將電子郵件文本轉換爲一個可操做的「郵件」地址。
url :用於將文本格式化爲可單擊的url。
html:用於渲染文本做爲html內容;在編輯模式下,以WYSIWYG編輯器,容許內容的格式,而不須要使用HTML語法。
對於數值字段,咱們有如下小部件:
handle:是專門爲列表視圖中的序列字段設計的,並顯示一個句柄,容許您將行拖到一個定製的順序。
float_time:擁有小時和分鐘的時間浮點字段格式.
monetary:做爲貨幣金額顯示浮動字段。它須要一個currency_id夥伴字段,另外一個字段名稱能夠設置選項=「{ 'currency_field ':' currency_id「}」。
progressbar 用一個浮點數表示爲一個進度百分比,而且能夠用於表示完成率字段.
對於關係和選擇字段,咱們有這些附加的小部件:
many2many_tags : 顯示按鈕標籤列表值.
selection:用於多對一字段的選擇字段部件。
radio 使用單選按鈕顯示選擇字段選項.
kanban_state_selection展現了看板狀態選擇列表的信號燈。通常狀態爲灰色,已經完成爲綠色,其餘狀態爲紅色.
priority 一個可點擊的星星列表的選擇字段。可選項通常爲數字.
按鈕(button元素)屬性:
icon 可用的按鈕圖標在 addons/web/static/src/img/下
string 按鈕的顯示文字
type 是動做執行類型。可能值是:workflow, object,action 默認是 workflow:
workflow 用於觸發工做流引擎信號;
object 用於調用Python方法;
action 用於運行窗口動做。
name 觸發的方法標識:工做流信號名、模型方法名稱或運行窗口操做的數據庫ID。
args 傳遞方法的參數
context 將值添加到上下文
confirm 針對對話框的確認
special="cancel" 用於嚮導,用來取消和關閉嚮導表單。
class 加載的類名(經常使用 oe_highlight)
動態視圖:
視圖元素也支持一些動態屬性,容許動態視圖根據字段值來改變他們的外觀或行爲。
其餘視圖:
日曆視圖:
<field name="arch" type="xml"> <calendar date_start="字段" color="顏色" display="[name], Stage [stage_id]" >
日曆視圖屬性:
date_start開始日期的字段,必需字段。
date_end結束日期的字段,可選字段。
date_delay持續天數的字段,可使用代替date_end。
all_day提供一個布爾字段是用來發送全天事件信號。
color 日曆條目顏色分組的字段 。這個字段中的每一個不一樣的值將被分配一個顏色,而且該字段全部同值的條目將具備相同的顏色。
display 是每一個日程表條目的顯示文本. 它使用方括號加字段名稱表示用戶記錄值,例如[name]。
mode 是日曆的默認顯示模式,不管是一天、一週仍是一個月。
圖形視圖:
<graph type="bar"> ... </graph>
圖形視圖元素能夠有一個類型屬性,能夠設置爲條形(默認)、餅狀或線。在條形的狀況下,可使用stacked="True"呈現堆疊在一塊兒的條形圖。
樞軸視圖:
<pivot> .... </pivot>