公共結構
- name (必選) 用于通過名字查找
- model 與view相關聯的model
- priority 當搜索查找view時,優先級最低的view會被返回
- arch 視圖layout的描述
- groups_id 指定可查看、使用視圖的用戶組id,many2many關系
- inherit_id 當前視圖的父級視圖
- mode 繼承模式,當inherit_id沒有設置時,它的值是primary,當設置了inherit_id后,它默認值是extension,可手動設置為primary
- application 定義哪些視圖可以被切換,默認情況下所有視圖都可以
繼承
視圖匹配
- 當通過(model, type)來請求視圖時,與model、type匹配且mode=primary 優先級最低的視圖會被返回
- 當通過id請求視圖時,如果它的模型不是primary,那么最取他的最近的mode=primary的父級視圖
視圖解析
解析符合mode=primary的視圖并得到arch內容:
- 如果當前視圖有一個父視圖,且父視圖是完全確定的,直接應用當前視圖的繼承規范
- 如果當前視圖沒有父視圖,那么arch將直接被使用
- 查找當前視圖的extensino模式子視圖,使用深度優先算法應用它們的繼承規范
應用到子視圖之后的結果產生最終的arch
繼承規范
繼承規范由一個定位元素組成,用來匹配父視圖中被繼承的元素、和 子視圖中會被用來修改的繼承元素
一共有三種用來匹配目標元素的定位元素:
- 帶有expr屬性的xpath元素 ,expr是一個用在arch中的xpath表達式,找到的第一個節點就是匹配結果
- 帶有name屬性的field元素,匹配第一個一樣name的field元素,其他的屬性在匹配時被忽略
- 其他的元素:匹配第一個擁有一樣的name及其他屬性的元素(忽略position,version屬性)
繼承規范通過可選的position屬性來指定如何修改匹配的節點
- inside(默認) - 添加到匹配的節點前
- replace - 替換匹配的節點
- after - 添加到匹配的節點的父節點之后
- before - 添加到匹配的節點的父節點之前
- attributes - 繼承的內容是一系列擁有name屬性的attribute 元素,且有可選的內容主體
1.如果attribute有內容主體,就在匹配的節點上添加以name命名的、以內容主體為值的屬性
2.如果attribute沒有內容主體,就將匹配節點上名字為name的屬性刪除,如果沒有對應的屬性,拋出一個錯誤
列表視圖
列表視圖的根元素是<tree>
,它可以有以下幾種屬性:
editable
默認情況下選擇單行記錄時會打開對應記錄的表單,該屬性讓數據可以在列表內進行編輯,有效的值是top和bottom,可讓新的記錄出現在列表的頂部或底部
default_order
重定義視圖的排序規則,以逗號分隔多個字段,可使用desc來進行倒序<tree default_order="sequence,name desc">
decoration-name
可以根據值來改變字段的顯示,$name可為bf (font-weight: bold), it (font-style: italic)或其他bootstrap樣式如danger, info, muted, primary, success,warning,取值為python表達式,對每條記錄執行相應表達式,當結果為true的時候將對應的樣式應用
create, edit, delete
可以通過將它們設置為false來禁用視圖中的對應操作
on_write
只當啟用editable時有用,在調用時會傳給函數新增或修改后的記錄,該函數需要返回一個用于更新列表的記錄id列表
button
在一個列表單元格中顯示按鈕
屬性列表:
1.icon -- 用來展示按鈕的圖標
2.string -- 當沒有icon的時候,button顯示的文字,有icon的時候、相當于alt屬性值
3.type -- 按鈕類型,表示點擊它之后如何影響系統1)workflow(默認):將按鈕name作為信號發送給工作流,記錄的內容作為參數
2)object : 調用當前數據列表模型的方法,方法名是按鈕的name,調用時帶有記錄id和當前上下文環境
3)action : 加載ir.actions,按鈕name是該action在數據庫的id,上下文環境擴展到列表的model(作為active_model)、當前記錄(active_id)、所有當前加載記錄的id(active_ids)
4.name,args 與type一樣
5.attrs 基于記錄值的動態屬性,將domain表達式應用在記錄上,當返回值為True的時候設置相應的屬性,一般用于invisible (隱藏按鈕)、readonly (禁用按鈕但顯示)這兩種屬性
6.states invisible屬性attrs的簡寫,給出一個以逗號分隔的state列表,需要模型有一個對應的state屬性,可以將不在state列表中的記錄的按鈕隱藏
7.context 當響應odoo的調用時,合并到視圖的上下文環境中
8.confirm 當點擊按鈕時給出的確認消息
field
定義一個所有記錄都需要展示的列
屬性列表:
1.name 需要顯示的字段名
2.string 該列的名稱
3.invisible 查詢而且保存該字段但不顯示
4.groups 可以看到該字段的用戶組列表
5.widget 用來展示該字段的可選形式progressbar 進度條用于展示浮點數
many2onebutton當關聯字段值存在時顯示勾,不存在顯示X
handle對于排序字段,直接顯示向上向下箭頭
sum, avg 在底部顯示基于當前頁面數據的計算
attrs 基于記錄值的動態屬性,只對當前欄有效,即可以第一條記錄中該字段顯示,第二條隱藏
表單
表單視圖用于展示單條數據,根元素是form,由常規html和構造部分、語義部分組成
構造部分
構造部分提供了結構和可視特性,以元素或者元素的子元素的形式應用到表單視圖的元素中
1.notebook
定義一個tab塊,每一個tab通過一個page子元素定義,每個page可以有以下屬性:
- string (required) --tab標簽的名稱
- accesskey --html accesskey
- attrs --基于記錄值的動態屬性
2.group
用于定義欄目在表單中布局,默認情況下一個group定義兩個列,并且每個最直接的子元素占用一個列,field類型的元素默認顯示一個標簽
group占用的列數是可以通過col屬性自定義的,默認2個;其他元素可以通過colspan屬性來定義占的列數,子元素是橫向布局的,可以通過設置string 屬性來定義group所展示的標題
3.newline
只在group元素里才有用,代表開啟新的行
4.separator
一條水平線,可以通過string屬性來設置該區域的標題
5.sheet
可以用作form的子元素用來表示更加狹義的表單
6.header
與sheet一起使用,顯示在sheet的上方的一個條,一般用于顯示工作流和狀態欄
語義部分
語義部分用于與odoo系統交互
1.button 與列表的button一致
2.field
展示當前記錄的某個字段,有以下屬性:
- name (必選) -- 用于展示字段名
- widget -- 每個字段根據其數據類型有一個默認的展示方式,widget屬性可指定用一個別的方式來展示
- options -- 用于指定widget字段配置的json對象
- class -- 用于設置當前元素的html class屬性:
oe_inline - 防止它自動將之后的字段換行
oe_left, oe_right - 相當于css的float
oe_read_only, oe_edit_only - 只在相應的模式下展示該字段
oe_no_button - 不為many2one字段顯示導航按鈕
oe_avatar - 當該字段為圖片時,將它展示為頭像(90*90的正方形)
- groups - 只將該字段展示給指定用戶組
- on_change - 在字段值改變時調用對應方法,從8.0開始改用模型中的 odoo.api.onchange()
- attrs - 基于記錄值的動態參數
- domain - 當以選擇的方式顯示關聯字段時,用過過濾數據
- context - 用于關聯字段,顯示數據時提供上下文環境
- readonly - 該字段可在讀和編輯模式下展示,但是永遠是不能編輯的
- required - 當該值沒有設置就保存時給出一個錯誤提示并阻止保存
- nolabel - 不顯示字段的標簽,只有在該字段是group子元素時用意義
- placeholder - 字段值為空時展示的提示
- mode - 對于one2many字段,用于展示其關聯的記錄的形式,有tree, form, kanban , graph,默認是tree
- help - 當將鼠標放在字段或標簽時顯示的提示
- filename - 對于二進制的字段,相關字段給出文件名
- password - 表示該字段是一個密碼,不明文展示
業務視圖規則
業務視圖是指向普通用戶的,像:機會、產品、合作伙伴、任務、項目等
一般情況下,業務視圖由以下元素組成:
- 展示在頂部的業務流程的狀態按鈕
- 中間展示一個表單的表格
- 底部展示評論和歷史操作記錄
<form>
<header> ... content of the status bar ... </header>
<sheet> ... content of the sheet ... </sheet>
<div class="oe_chatter"> ... content of the bottom part ... </div>
</form>
1.狀態條
用于展示當前記錄的狀態和相應的動作按鈕
按鈕
按鈕的順序與業務流程的順序一致,例如在銷售流程中,流程如下:發送詢價單->確認詢價->創建發貨單->發貨
高亮的按鈕強調下一步的流程,用于提示用戶,通常放在第一個。另外取消按鈕一般被設置成灰色,如在發貨里退款按鈕不會被設置為高亮。通過設置oe_highlight的class屬性來將按鈕元素高亮顯示
<button class="oe_highlight" name="..." type="..." states="..."/>
狀態
使用statusbar 部件,并將當前的狀態標紅。普通的狀態會一直顯示出來,異?;蛞蕾囉谄渌鞒痰臓顟B只有在當前狀態下才會顯示。states是根據字段值對應的順序來展示的,一直顯示的狀態可通過statusbar_visible屬性指定:
<field name="state" widget="statusbar" statusbar_visible="draft,sent,progress,invoiced,done" />
4.表格
業務視圖展示出來要像一張表格一樣

- 在page或form里的元素不會自動分組,它們會根據普通的html規則來布局,可以通過group或div標簽來進行分組展示
- 默認情況下group標簽定義兩列,可以通過col="n"來指定多列,并且每列的寬度是一樣的。
- 可以給group標簽添加string屬性來給該區塊內容添加標題
<group string="Time-sensitive operations">
- 不在group內的field標簽默認是不生成label的,可以通過<label for="field_name>來指定label
1.表格頭
某些表格是它們只在編輯模式下才顯示字段的標簽
使用oe_edit_only 的class屬性來指定label只在編輯模式下才展示,oe_inline 屬性將多字段設置展示到單行中
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
<label for="planned_revenue" class="oe_edit_only"/>
<h2>
<field name="planned_revenue" class="oe_inline"/>
<field name="company_currency" class="oe_inline oe_edit_only"/> at
<field name="probability" class="oe_inline"/> % success rate
</h2>
2.按鈕
一個表單中可以放置多個相關的操作按鈕,如果商機表單里有安排一個電訪、安排一次會面,可直接顯示在表單中
<div class="oe_button_box" name="button_box">
<button string="安排電訪" name="..." type="action"/>
<button string="安排會面" name="action_makeMeeting" type="object"/>
</div>
3.分組和標題
為了方便視圖擴展,需要給group指定一個name屬性,這樣在擴展視圖中可以更容易的找到添加字段的正確位置
特殊案例:小計
某些class是用來展示小計時使用的,比如發貨單:
<group class="oe_subtotal_footer">
<field name="amount_untaxed"/>
<field name="amount_tax"/>
<field name="amount_total" class="oe_subtotal_footer_separator"/>
<field name="residual" style="margin-top: 10px"/>
</group>
4.placeholder和行內輸入框
有時候字段的標簽把表單搞的太復雜了,可以將標簽隱藏而采用placeholder來提示用戶該輸入框需要輸入什么,同時可以通過div包裹多個inline輸入框來讓它們像是單個字段一樣顯示,例:
<group>
<label for="street" string="Address"/>
<div>
<field name="street" placeholder="Street..."/>
<field name="street2"/>
<div>
<field name="zip" class="oe_inline" placeholder="ZIP"/>
<field name="city" class="oe_inline" placeholder="City"/>
</div>
<field name="state_id" placeholder="State"/>
<field name="country_id" placeholder="Country"/>
</div>
</group>
5.圖片
圖片一般在表單的右邊顯示
<field name="product_image" widget="image" class="oe_avatar oe_right"/>
6.標簽
大多數多對多關系字段,如分類,一般使用多標簽來展示
<field name="category_id" widget="many2many_tags"/>
配置表單指導原則
一般不需要header(因為沒有狀態、工作流、按鈕),不需要表格,如:階段配置
彈出框表單指導原則
例:商機的安排電話訪問表單
1.避免使用分隔線
2.不使用取消按鈕(因為一般用戶會直接關閉彈框來替代)
3.操作鈕鈕必須被高亮顯示
4.如果是文本框,使用placeholder來代替label
5.將按鈕放在header元素中
配置向導指導原則
例:設置-配置-銷售
1.單行顯示(沒有彈出框)2.沒有表格 3.保留取消按鈕 4.保存按鈕標紅
圖表
圖表是用于將數據進行聚合顯示用的,它的根標簽是gragh,有以下幾種屬性:
- type - bar 柱形圖(默認)、line 線形圖 、 pie 扇形圖
- stacked - 只在柱形圖里使用,設置為True的時候,會在將柱形圖排到group里
圖表里唯一能插入的元素就是field,它有以下幾種屬性
- name 必選 -- 用在圖表中的字段名
- type -- 指定該字段是進行分類統計還是總計
row 默認 -- 根據指定字段分組,所有圖表至少支持一級分組,有些支持多級,在pivot視圖中,每個分組拿自己的記錄
col -- 只在pivot表中使用,創建一個列優先的分組集合
measure -- 分組中用來聚合的字段
- interval -- 在基于date或datetime字段進行分組統計時使用day, week, month, quarter , year來計算
pivot
pivot視圖使用 pivot表來展示匯總數據,根標簽是pivot,有以下屬性:
- disable_linking - 設置為True時取消單元格和數據列表視圖之間的鏈接
- display_quantity - 設置為True時以默認方式顯式數量
pivot跟其他圖表一樣也只允許field元素
看板視圖
看板視圖展示出一個看板圖,由多個卡片構成,可以是對列分組展示或直接展示,它的根標簽是kanban,有以下屬性
- default_group_by -- 當action或search沒有進行分組時,視圖是否需要進行分組,取值為用于進行分組的字段名
- default_order -- 當用戶沒有對記錄進行排序時卡片中所使用的排序字段
- class -- 添加看板視圖根html的類屬性
- quick_create -- 是否可以在不切換到表單視圖的情況下直接創建記錄,當看板視圖是經過分組的時候它是啟用的,否則不啟用,可通過設置True來強制啟用,False強制禁用
子元素可以是以下幾種
field
定義用來集合計算或用在看板視圖邏輯中的字段,如果某字段僅用于在看板視圖中展示,它不需要預先進行定義,有以下屬性:
- name (required) -- 用于獲取數據的字段名
- sum, avg, min, max, count -- 在看板視圖最上方展示對應的計算后的值,每個字段只支持一個
templates
定義一個QWeb模板列表,卡片可以分割成多個模板,但看板視圖至少需要定義一個kanban-box標簽,每條記錄會執行一次,看板視圖用的是嚴格的qweb javascript,有以下幾個環境變量:
- instance -- 當前qweb實例
- widget -- 可用來獲取元數據信息,
- record -- 一個帶有所有被請求字段的對象,每個字段有value和raw_value兩個屬性,value遵循當前用戶格式,raw_value是直接讀取出來的數據
- formats -- 用于操縱和轉換值的web.formats()模塊
- read_only_mode -- 只讀
按鈕和字段
由于看板模板是標準的qweb,看板視圖有特殊的處理field、button、a標簽的方式
- 默認情況下字段值顯示的是格式化之后的,除非它匹配了對應的視圖widget
- 擁有type屬性的按鈕和鏈接會轉換成odoo相關的操作:
1.action,object -- 與odoo按鈕的屬性一致
2.open -- 在只讀模式下打開卡片的視圖
3.edit -- 在編輯模式下打開卡片視圖
4.delete -- 刪除卡片的記錄且移除卡片
javascript API
class KanbanRecord()
- Widget() 將單條記錄解析到卡片中
- kanban_color(raw_value) 將一個color片段轉換成oe_kanban_color_color_index
- kanban_getcolor(raw_value) 將color片段轉換為color_index
- kanban_image(model, field, id[, cache][, options]) 將指定字段轉換成圖片URL
model -- 保存圖片的model, field -- 保存圖片數據的字段名 , id -- 需要展示圖片的記錄id,cache--圖片在瀏覽器的緩存時間(秒),0表示不緩存
- kanban_text_ellipsis(string[, size=160]) 將比較長的內容提取一部分顯示
日歷視圖
日歷視圖按天、周、月來顯示數據,根元素是calendar,有以下屬性:
- date_start (必選) -- 儲存開始時間的字段
- date_stop -- 儲存結束時間的字段,當提供了該字段時記錄可以直接在視圖中刪除
- date_delay -- 與date_stop類似,表示的是該事件的持續時間
- color -- 用于定義顏色的字段,顏色字段值相同的記錄會在視圖中以相同的顏色顯示
- event_open_popup -- 以彈框代替表單來打開事件,默認是禁用的
- quick_add -- 允許快速添加事件,只需要提供name就行,當創建失敗時會轉到一個完整的表單彈出框
- display -- 將字段名用[]包裹展示
- all_day -- 布爾型,用來定義對應事件是否是全天有效
- mode -- 默認的顯示模式:day, week, month
甘特圖
甘特圖用于展示甘特圖表如流程,根元素是gantt,沒有子元素,但可以有以下屬性:
- date_start (必選) -- 儲存開始時間的字段
- date_stop -- 提供結束時間的字段,可以用date_delay來實現同樣的作用,兩者必須提供一個,如果該字段被設置為False,那該事件的開始時間和結束時間是同個時間點
- date_delay -- 提供事件持續時間的字段
- duration_unit -- 持續時間的單位,minute, hour (默認), day, week, month, year
- default_group_by -- 任務分組的依據字段
- type -- gantt(默認) 傳統甘特圖、 consolidate(首個child的值被合并甘特圖任務中)、planning(children會自動顯示到甘特圖任務中)
- consolidation -- 在記錄單元格中用于顯示合并值的字段名
- consolidation_max -- 數據字典,表示超過一定的值會標紅顯示 ,如:
{"user_id": 100}
- string -- 展示在合并值旁邊的字符,如果沒設置會自動取對應字段的label
- fold_last_level -- 如果設置了該屬性,最后一個分組級別會被折疊
- round_dnd_dates -- 開始和結束時間取整
- drag_resize -- 任務調整,默認True
示意圖
示意圖可用來展示原來就是圖表的記錄,根元素是diagram,沒有屬性,有幾種子元素:
node(必選)
定義圖表的節點,有以下屬性:
- object -- 節點對應的model
- shape -- 就像列表視圖的顏色、字體一樣的形狀表示,唯一可選的取值是rectangle (長方形),默認無
- bgcolor -- 用來表示節點的背景顏色,默認是白色,可取值grey
arrow (必選)
用于定義圖表的箭頭,有以下屬性:
- object(必選) -- 箭頭對應的model
- source (必選) -- model的Many2one字段,用于指向箭頭的源節點數據
- destination (必選) -- model的Many2one字段,指向箭頭的目標節點數據
- label -- python格式的屬性列表,相應的屬性值會用作箭頭的label顯示
label
用于解釋示意圖的節點,string屬性定義的是節點的內容,每個label帶有編號顯示在示意圖頭部
搜索視圖
搜索視圖與其他視圖不同,因為它不實際顯示內容,它用于過濾其他視圖的內容,定義的形式卻一樣。它的根元素是search,沒有屬性??梢杂幸韵聨字凶釉兀?/p>
field
field使用用戶提供的值來定義domain表達式和上下文環境,當產生搜索domain表達式后,會與field提供的表達式使用and進行合并作用,可有以下幾種屬性:
- name -- 需要過濾的字段名
- string -- 字段的label
- operator -- 默認情況下field會生成[(name, operator, provided_value)]格式的表達式,其中name是字段名,provided_value是用戶提供的值,operator屬性可以重寫默認的運算符(默認情況下是根據字段類型分配,數字型是=,字符型是ilike)
- filter_domain -- 用于搜索的完整的domain表達式,可以用self變量來將提供的值注入,當operator和filter_domain同時賦值時,filter_domain有最高優先級
- context -- 允許添加上下文的值
- groups -- 使該字段只對某些用戶組可用
- widget -- 使用指定的搜索部件(唯一的用例是V8的many2one字段選擇插件)
- domain -- 如果字段提供自動完成時(many2one),過濾出可能的自動完成結果
filter
過濾器搜索視圖里是被預定義的,只能被啟用或禁用。主要用于將數據添加到搜索的上下文環境或者添加新的片段到搜索filter,有以下屬性:
- string (required) -- 過濾器的label
- domain -- 一個domain表達式,被添加到action的domain表達式中,作為搜索的domain表達式一部分
- context -- 一個python格式數據字典,被合并到action的domain表達式中,用于生成搜索的domain表達式
- name -- 過濾器的邏輯名
- help -- 過濾器的描述文字
- groups -- 指定過濾器可用的用戶組
<filter domain="[('state', '=', 'draft')]"/>
<filter domain="[('state', '=', 'done')]"/>
#上述代碼當兩個都選的時候是以or聯接的
<filter domain="[('state', '=', 'draft')]"/>
<separator/>
<filter domain="[('delay', '<', 15)]"/>
#上述代碼當兩個都選的時候用and聯接
separator
用于將多組過濾器分開,一般用于很簡單的視圖里
group
也是用于分離多組過濾器,在復雜的視圖中比separator更加易讀
默認搜索
搜索字段和過濾條件可以通過action的context使用search_default_name 配置,對于字段就是需要搜索的值,對過濾器它是一個布爾值,例:
{
'search_default_foo': 'acro',
'search_default_bar': 1
}
#自動激活bar過濾器,并在foo字段搜索acro
QWeb視圖
QWeb視圖是標準的qweb模板,嵌入在視圖的arch標簽中,沒有指定的根標簽
每個qweb視圖只能包含一個模板,模板名必須與視圖的id完全一致
譯自odoo官方文檔:http://www.odoo.com/documentation/10.0/reference/views.html,不當之處歡迎批評指正。
內容發布自http://www.lxweimin.com/u/6fdae8ec06bc,轉載請注明出處