-----------------
更新時間
19:04 2016-09-29 星期四
11:17 2016-09-18 星期日
18:13 2016-04-05 星期二
15:05 2016-03-14 星期一
11:46 2016-02-25 星期四
14:51 2016-02-23 星期二
18:07 2016-02-19 星期五
17:44 2016-02-17 星期三
-----------------
* 視圖標簽類型
# <record>標簽有屬性 model="ir.ui.view" ,它包含本身的視圖定義
# <record>標簽有屬性 mo="ir.actions.act_window",它將動作和視圖鏈接起來
# <menuitem>標簽,把菜單和動作鏈接起來
* 模板(Templating)
<template id="..." name="...">
html
</template>
--------
<record id="..." model="ir.ui.view">
<field name="name">...</field>
...
<field name="arch" type="xml">
html
</field>
</record>
#渲染模板
http.request.render(template[,values])
@http.route('/hello/')
def hello(self, **kw):
return http.request.render(module.hello)
-------
<template id="hello">
<p> hello , <t t-esc="name"/></p>
</template>
--------
return http.request.render(module.hello,{'name':"World"}) # 帶參數
# Qweb 設置變量值
<template id="hello">
<t t-set="greet" t-value="name+'!!!'">
<p> hello , <t t-esc="greet"/></p>
</template>
--------
<template id="hello">
<t t-set="greet" t-valuef="{{name}}!!!">
<p> hello , <t t-esc="greet"/></p>
</template>
---------
原樣輸出
<template id="hello">
<t t-set="greet">
<em>Hello</em>, <t t-esc="name"/>
</t>
<p> hello , <t t-raw="greet"/></p>
</template>
# Qweb 語句
條件語句
<template id="hello">
<p>
<span t-if="name=='World'" />
Hello World!
</span>
</p>
</template>
-----
<template id="hello">
<t t-set="condition" t-value="name=='World'">
<p>
<span t-if="condition" />
Hello World!
</span>
</p>
<p>
<span t-if=" not condition" />
Hello not World!
</span>
</p>
</template>
循環語句
<template id="hello">
<ul>
<li t-foreach="name" t-as="letter">
<t t-esc="letter_index"/>:<t t-esc="letter" />
</li>
</ul>
<template>
-------
<t t-foreach="seq" t-as="value">
* value 項值
* value_size 大小
* value_all 總數
* value_index 索引號
* value_first:bool 第一個
* value_last:bool 最后一個
* value_parity:'even'|'odd' 當前是第奇數還是偶數
調用其它模板
采用t-call
<template id="sub">
<t t-esc="identifier" />
</template>
<template id="hello">
<p>
hello,
<t t-call="module.sub">
<t t-set="identifier" t-value="name" />
</t>
</p>
</template>
屬性設置
t-att-{attname}="{expression}"
t-attf-{attname}="{expression}"
------
<template id="hello">
<p t-att-class="name.lower()">Hello,world</p>
<p t-attf-class="cl-{{name.lower()}}">Hello,world</p>
<template>
字段渲染
@http.route('hello/<model("res.users"):user') # 給用戶的id即可
def hello(self,user,**kw)
return http.request.render('module.hello',{'user':user})
-------
<template id="hello">
<p t-field="user.display_name" />
</template>
---------
可用字段選擇修飾
<template id="hello">
<p t-field="user.creat_date" />
<p t-field="user.creat_date" t-filed-options='{"format":"long"}'/>
<p t-field="user.creat_date" t-filed-options='{"format":"EEE"}'/>
</template>
-------------
<template id="hello">
<p t-field="user.wealth" />
<p t-field="user.wealth" t-filed-options='{
"widget":"monetary"
"display_currency":"user.company_id.currency_id"
}'/>
</template>
------------
<template id="hello">
<p t-field="user.create_date" t-field-options='{"widget":relative}}' />
</template>
模板繼承
<template id="hello">
<p> Base template </p>
</template>
<template id="hello2" inherit_id="hello" name="Extender">
<xpath expr="//p" position="before">
<h1>Extended!</h1>
</xpath>
</template>
得到的結果:
<h1>Extended!</h1>
<p>Base template</p>
--------------
<template id="hello">
<p class="a">A</p>
<p class="b">B</p>
</template>
<template id="hello2" inherit_id="hello" name="Extender">
<xpath expr="//p[hasclass('b')]" position="before">
<h1>Extended!</h1>
</xpath>
</template>
得到的結果:
<p class="a">A</p>
<h1>Extended!</h1>
<p class="b">B</p>
----------
調用系統的基礎模板:
<template id="hello">
<t t-call="website.layout">
<p class="a">A</p>
<p class="b">B</p>
</t>
</template>
<template id="hello2" inherit_id="hello" name="Extender">
<xpath expr="//p[hasclass('b')]" position="before">
<h1>Extended!</h1>
</xpath>
</template>
-----------
* 視圖
<record id="view_id" model="ir.ui.view">
<field name="name">view.name</field>
<field name="model">object_name</field>
<field name="type">form</field>
<field name="priority" eval="16" />
<field name="arch" type="xml">
<!-- view content <form>,<tree>,<graph>,.. -->
</field>
</record>
屬性:
openerp/addons/base/ir/ir_ui_view.py view類中的_columns
model:固定為 ir.ui.view
id 唯一,調用和繼承會用到
name 視圖名稱
model 對象
type 有多種類型 tree,form,graph,calendar,diagram,gantt,kanban,search
priority 排序
* 視圖繼承(用於修改已有的視圖):
這里有一個小技巧:
當你繼承父視圖,
1.只添加字段時,本視圖外id值可以和父視圖id值 一樣,這樣后面再繼承方便
2.當要隱藏或刪除父字段時,本視圖外id不能和父視圖id值一樣,否則后面無法升級模塊
<record model="ir.ui.view" id="view_partner_form">
<field name="name">res.partner.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" /> <!--聲明要修改那一個視圖-->
<field name="arch" type="xml">
<notebook position="inside">
<page string="Relations">
<field name="relations_ids" colspan='4' nolabel="1" />
</page>
<notebook>
<field>
</record>
所有的操作只能在
<field name="arch" type="xml">... </field>
定位5種屬性
@ inside(默認):附加在標簽內
@ after:后添加內容標簽
@ before:前的內容標簽
@ replace: 更換標簽內容
@ attributes: 更改標簽內容的屬性
支持定位方法:
<notebook position="inside">
<xpath expr="//page[@name='page_history']" position="inside">
<field name="mobile" position="after">
<filter name="consumable" position="after" >
<group name="bank" position="after">
<xpath expr="//field[@name='standard_price']" position="replace">
<xpath expr="//button[@name='open_ui']" position="replace">
<xpath expr="//div[@class='oe_employee_details']/h4/a" position="after">
<xpath expr="//form/sheet/notebook/page/field[@name='line_ids']/tree/field[@name='analytic_account_id']"
position="replace">
<xpath expr="/form/sheet/notebook/page/field[@name='line_ids']/form/group/field[@name='analytic_account_id']"
position="replace">
# 更換內容:
<record model="ir.ui.view" id="view_partner_form1">
<field name="name">res.partner.form.inherit1</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<page string="Extra Info" position="replace">
<field name="relations_ids" colspan='4' nolabel="1" />
</page>
<field>
</record>
# 刪除內容:
<record model="ir.ui.view" id="view_partner_form2">
<field name="name">res.partner.form.inherit2</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<field name="lang" position="replace"/>
<field>
</record>
# 插入內容
<record model="ir.ui.view" id="view_partner_form3">
<field name="name">res.partner.form.inherit3</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<field name="lang" position="before">
<field name="relation_ids" />
</field>
<field>
</record>
<record model="ir.ui.view" id="view_partner_form4">
<field name="name">res.partner.form.inherit4</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<field name="lang" position="after">
<field name="relation_ids" />
</field>
<field>
</record>
# 修改屬性:修改屬性能實現的功能,不要使用replace
<xpath expr="//field[@name='name']"position="attributes">
<attribute name="required">1</attribute>
</xpath>
# 多變化
<record model="ir.ui.view" id="view_partner_form5">
<field name="name">res.partner.form.inherit5</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<field name="lang" position="replace"/>
<field name="website" position="after">
<field name="lang" />
</field>
<field>
</record>
# xpath的節點
<record model="ir.ui.view" id="view_partner_form6">
<field name="name">res.partner.form.inherit6</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<data>
<xpath expr="/feild[@name='address']/form/field[@name='email']"
position="after">
<field name="age" />
</xpath>
<xpath expr="/field[@name='address']/tree/field[@name='email']"
position="after">
<field name="age" />
</xpath>
</data>
<field>
</record>
* 窗口操作(視圖動作)
如下一些代碼
<?xml version="1.0" encoding="utf-8" ?>
<openerp>
<data>
<act_window id="action_todo_stage"
name="To-Do Task Stages"
res_model="todo.task.stage"
view_mode="tree,form" />
<act_window id="todo_app.action_todo_task"
name="To-Do Task "
res_model="todo.task"
view_mode="tree,form,calendar,gantt,graph"
target="current"
context="{'default_user_id':uid}"
domain="[]"
limit="80" />
<act_window id="action_todo_task_stage"
name="To-Do Task Stages"
res_model="todo.task.stage"
src_model="todo.task"
multi="False" />
</data>
</openerp>
可以用ir.action.act_window 重新其中一菜單對角
<record id="action_todo_stage" model="ir.actions.act_window">
<field name="name">To-Do Task Stage</field>
<field name="type">ir.actions.act_window</field>
<field name="domain">["list of 3-tuples (max 250 characters)"]</field>
<field name="context">{"context dictionary (max 250 characters)"}</field>
<field name="res_model">todo.task.stage</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field> 這里表示有兩個視圖可用,且先tree,后form, 若只有tree, 則后面點列表是沒反應的
<field name="search_view_id" ref="todo_task_search"/>
<field name="view_id" ref="view_form_todo_task_ui" />
</record>
窗口的動作是存在 ir.actions.act_window 模型中的,我們可以在xml文件中用<act_window>來快捷定義
下面是部分屬性說明,完整的可以在 openerp/addons/base/ir/ir_actions.py 中的 ir.actions.act_window
類中可以找到
# name 顯示的標題
# type 動作類型 ,默認ir.actions.act_window
# view_id 中的 ref 值是對應視圖對象的id 觸發時用哪個視圖
# context 設置目標視圖的上下文
比如:<field name="context">{'search_default_group_by_product': True, 'search_default_group_by_location': True}</field>
<!--默認搜索 以產品分組 和以庫位分組-->
# domain 過濾記錄按條件,如:[["customer", "=", true]]
# res_id: 當動作打開視圖是表單視圖時,要指定的加載記錄id,只有‘view_mode’ 值為 form時才有效
否則就會新建一個記錄 如:"res_id": a_product_id,
# res_model 動作響應的目標模型
# target 如果設置為new 就打開新窗口,默認是 current
# view_mode:列出允許使用的視圖模式 如 form, tree, calendar,etc 默認是 tree,form
# view_type:設定tree時的列表是樹狀還是普通列表, tree-樹狀 form-普通列表 缺省是form
# usage: 過濾菜單和動作
# view_ids:
# views:是(view_id,view_type) 元組對列表,第一組是動作默認打開的視圖
如:"views": [[False, "tree"], [False, "form"]]
# limit 指列表視圖時,一頁的記錄數,默認是80
# auto_refresh: 在視圖中添加一個刷新功能
# groups_id:權限組
# search_view_id 指定響應的搜索視圖(id,name) 元組對
# filter:列表視圖顯示過濾器(bool)
# auto_search: 加載默認視圖后,自動搜索
# src_model 指定可以啟動視圖的更多按鈕
# multi 設為True, 更多按鈕顯示在列表視圖,否則顯示在表單視圖
系統的默認值:
_defaults = {
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'tree,form',
'context': '{}',
'limit': 80,
'target': 'current',
'auto_refresh': 0,
'auto_search':True,
'multi': False,
}
* 菜單項
如下一些代碼
<menuitem id="menu_todo_task_main"
name="To-Do" parent="mail.mail_my_stuff"/>
<menuitem id="todo_app.menu_todo_task"
name="To-Do Tasks"
parent="menu_todo_task_main"
sequence="10"
action="todo_app.action_todo_task"/>
<menuitem id="menu_todo_task_stage"
name="To-Do Stages"
parent="menu_todo_task_main"
sequence="20"
action="action_todo_stage"/>
在 設置-> 技術-> 用戶界面-> 菜單 可以看到已定義的菜單
菜單是存在 ir.ui.menu 模型中的,我們可以在xml文件中用<menuitem>來快捷定義
openerp/addons/base/ir/ir_ui_menu.py
# id 菜單的唯一id用於父子級別和調用
# name 在視圖中顯示的名字 如果定義的 action,這個可以省略,會用對應action
的name值
# sequence 顯示排序
# parent 本菜單的父菜單,子菜單都要指定,只有頂級菜單不要指定
# action 本菜單的連接動作
# groups 指定權限組,用戶組的extraID
這里的action 要關聯到視圖動作定義中的id
如 action="action_todo_stage 對應視圖動作中的 id="action_todo_stage"
注:在定義菜單和窗體動作時,一定要注意一下順序,先定義菜單對應的窗體動作
如:
<record model="ir.actions.act_window" id="action_list_ideas">
<field name="name">Ideas</field>
<field name="res_model">idea.idea</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_ideas" parent="menu_root" name="Ideas" sequence="10"
action="action_list_ideas"/>
* 在中間“更多”按鈕加動作
<record id="action_sale_order_make_invoice" model="ir.actions.act_window">
<field name="name">Make Invoices</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">sale.make.invoice</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_sale_order_make_invoice"/>
<field name="target">new</field>
<field name="multi">True</field>
</record>
<record model="ir.values" id="sale_order_make_invoice">
<field name="model_id" ref="sale.model_sale_order" />
<field name="name">Make Invoices</field>
<field name="key2">client_action_multi</field>
<field name="value" eval="'ir.actions.act_window,' + str(ref('action_sale_order_make_invoice'))" />
<field name="key">action</field>
<field name="model">sale.order</field>
</record>
重點講第二段
@model_id 對應的值是所在那個模型中加 格式[模塊名].model_模型名 用_連起來,若是本模塊,可以省了[模塊名].
視圖上采用ref 引用模型都是這種格式
@name 定的名稱
@key2 動作多窗口
@value 引用一個已定義的窗體動作來完成
@key 產生的類型,這里是動作
@model作用在的模型
* 三個主要的視圖 list或 tree(樹狀)視圖, 表單form視圖, search搜索視圖 對應模型 ir.ui.view
在openerp/addons/base/ir/ir_ui_view.py 中可以看到有 tree, form, graph, calendar, diagram
gantt,kanban, search,qweb 這些視圖
定義視圖的總框架:
<record model="ir.ui.view" id="view_id">
<field name="name">view.name</field>
<field name="model">object_name</field>
<field name="priority" eval="16"/>
<field name="arch" type="xml">
<!-- view content: <form>, <tree>, <graph>, ... -->
</field>
</record>
arch 字段一定要申明 type為xml 否則無法解析
* 表單視圖
# 添加在動作和菜單項后面 <act_window> <menuitem>
代碼如下:
<record id="view_form_todo_task_ui" model="ir.ui.view">
<field name="name">view_form_todo_task_ui</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<form>
<header> <!-- Buttons and status widget --> </header>
<sheet> <!-- Form content --> </sheet>
<!-- History and communication: -->
<div class="oe_chatter">
<field name="message_follower_ids"
widget="mail_followers"/>
<field name="message_ids"
widget="mail_thread"/>
</div>
</form>
</field>
</record>
#包含三個可視域:
<header>
<sheet> 放內容的
<bottom> 歷史記錄和社交部分
# header 狀態欄
<header>
<field name="stage_state" invisible="True"/>
<button name="do_toggle_done" type="object"
attrs="{'invisible':
[('stage_state','in',['done','cancel'])]}"
string="Toggle Done" class="oe_highlight"/>
<!-- Add stage statusbar: ... -->
</header>
@ class="oe_highlight" 加高亮
@ invisible 為可見性,還可以用到其它元素上,不僅在<botton>上
-------------------------
<header>
<field name="state" widget="statusbar"
statusbar_visible="draft,sent,progress,invoiced,done"
statusbar_colors="{'shipping_except':'red','waiting_date':'blue'}"/>
</header>
@ 加入狀態掛件
# 元素功能分組排列
group 分組的性性
@ colspan 說明該控件占用父容器多少列 openerp form 為頂級容器,約定為4列
colspan 缺省是 2
@ rowspan 行數
@ expand
@ col 用於容器控件,如group 表不這個容器內部分幾列
@ string 組的名稱
@ openerp 控件一般都有lable 這樣占兩列
@ class 加載對應的類名用於定位
舉一例:
①<group col="6" colspan='4'>
②<group col="2" colspan="4">
<separator colspan="2" string="Product Description"/>
<field name="name" select="1">
<field groups="base.group_extended" name="variants" select="2" />
</group>
③<group col="2" colspan="1">
<separator colspan="2" string="Codes"/>
<field name="default_code" select="1">
<field groups="base.group_extended" name="ean13" select="2" />
</group>
④<group col="2" colspan="1">
<separator colspan="2" string="Product Type"/>
<field name="sele_ok" select="2">
<field name="purchase_ok" select="2">
<field groups="base.group_extended" name="rental" select="2" />
</group>
</group>
① colspan="4" 占據了整行,col="6" 表示①這個組控件內分為6列
② col="2" 表示②這個組控件內分為2列, colspan="4" 表示占①組控件4列
③ col="2" 表示③這個組控件內分為2列, colspan="1" 表示占①組控件1列
④ col="2" 表示④這個組控件內分為2列, colspan="1" 表示占①組控件1列
注:
加了<group>...</group>, 里面的field會自動加上<label>
<group>頂級是默認里面分為4列
<group>子級里面默認是2列,這樣<label>占一列,<field>值占一列
<group>里面的field不要加<label>要指明,如:
<group string="Source Term">
<field name="source" nolabel="1" height="400"/>
</group>
group 也有對應的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>
# 有時<sheet>之間的內容采用html來布局會更靈活
如:
<sheet>
<div class="oe_title">
<label for="name" class="oe_edit_only" string="Idea Name" />
<h1><field name="name" /></h1>
</div>
<separator string="General" colspan="2" />
<group colspan="2" col="2">
<field name="description" placeholder="Idea description..." />
</group>
</sheet>
<field name="product_image" widget="image" class="oe_avatar oe_right"/>
# notebook 是標簽塊
@string tab的標簽名
@accesskey
@attrs
# newline
# separator 分割線
# header 頭部
* 視圖元素
#按鈕<button>,支持的屬性
icon 可用的icon在 addons/web/static/src/img/icons
string 按鈕的顯示文字
type 值可以是 workflow, object action
name 就是要觸發的方法標識
args 傳遞方法的參數
content 上下文
confirm 針對對話框的確認
special="cancel" 用於向導
states 可見的狀態
classname 加載的類名(常用 oe_highlight)
例子:
<footer>
<button name="act_update" string="Update" type="object" class="oe_highlight"/>
or
<button special="cancel" string="Cancel" type="object" class="oe_link"/>
</footer>
#字段<field>,支持的屬性
name 字段技術名
string 顯示名
help 幫助提示
placeholder 占位文字
widget 小物件 后面常用值(progress, many2onebutton, handle, statusbar, image, many2many_tags, selection)
options 小物件對應的選項,
class 加載類名
(常用的
oe_inline
oe_left
oe_right
oe_read_only
oe_edit_only
oe_no_button
oe_avatar 圖片字段用
)
invisible="1" 標識不可見
groups 指定權限的可見 后面的值一般為 用戶組或用戶名
nolabel="1" 不顯示標簽,會用於<group>之內
readonly="1" 標識只讀
required="1" 標識不能為空
on_change 這是舊版的,新版用@api.change(self)來處理
domain 條件過濾(僅用於關聯字段)
context 上下文(僅用於關聯字段)
required 必填
placeholder 占位的字符
mode 用於 One2many (有值 tree, form, kanban, graph 默認是tree)
help 字段的提示信息
sum,avg 小計,平均值
password="True" 密碼框
filename 文件上傳用
attrs 后面是表達式
# 標簽
<label>
<label for="name" class="oe_edit_only"/>
<h1><field name="name"/></h1>
#關聯字段
options={'no_open':True,'no_create':True}
常用於 context 和 domain中
# 小物件
用於文本字段
email url html
用於數字字段
float_time monetary progressbar
用於關聯和選擇
many2many_tags
selection
radio
kanban_state_selection
priority
* 事件變化
@api.onchange('field1','field2')
舉例說明:
視圖中定義如下:
<!-- content of form view -->
<field name="amount"/>
<field name="unit_price"/>
<field name="price" readonly="1"/>
對應模型中的定義如下:
# onchange handler
@api.onchange('amount', 'unit_price')
def _onchange_price(self): #當用api.onchange時 self為記錄,不是記錄集
# set auto-changing field
self.price = self.amount * self.unit_price
# Can optionally return a warning and domains
return {
'warning': {
'title': "Something bad happened",
'message': "It was very bad indeed",
}
}
這樣只要 amount 或 unit_price 字段的值變化,對應的price值跟着變化
注:只支持簡單字段,像many2one, one2many 這些字段不支持
若要指定在那個字段去觸發,則在視圖中定義
<field name="name" on_change="0"/>
on_change="0"
* 動態視圖
# group
# states
增加靈活性 用 refers_to
<field name="refers_to"
attrs="{'invisible': [('state','=','draft')]}" />
* 列表視圖(分為兩種,正常列表,和樹狀列表)
<record id="todo_app.view_tree_todo_task" model="ir.ui.view">
<field name="name">To-do Task Tree</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<tree editable="bottom"
colors="gray:is_done==True"
fonts="italic: state!='open'" delete="false">
<field name="name"/>
<field name="user_id"/>
</tree>
</field>
</record>
# <tree>
屬性:
editable 設置字段在列表直接可以編輯
例:<tree string="Translations" editable="top">
colors 按條件設定記錄的顏色
<tree string="Idea Categories" colors="blue:state=='draft';red:state=='trashed'">
<field name="name"/>
<field name="state"/>
</tree>
default_order 指定列表記錄的排序條件字段
<tree default_order="sequence,name desc">
toolbar 設置為True,會顯示層次結構像菜單一樣
fonts 按條件設定記錄的字體
create,delete,edit 若設置為false 則為不可用
string :視圖的標簽,是可以翻譯的
允許元素:
field, group, separator, tree, button, filter, newline
# 當不要創建和編輯功能時,在<tree> 加上 create="0"
看一下樹狀列表,以產品分類為例:
<record id="product_category_tree_view" model="ir.ui.view">
<field name="name">product.category.tree</field>
<field name="model">product.category</field>
<!--父子 -->
<field name="field_parent">child_id</field>
<field name="arch" type="xml">
<tree toolbar="True" string="Product Categories">
<field name="name"/>
</tree>
</field>
</record>
<!--產品分類動作 -->
<record id="product_category_action" model="ir.actions.act_window">
<field name="name">Products by Category</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.category</field>
<field name="domain">[('parent_id','=',False)]</field>
<!--采用樹狀-->
<field name="view_type">tree</field>
<field name="view_id" ref="product_category_tree_view"/>
<field name="help" type="html">
<p>
Here is a list of all your products classified by category. You
can click a category to get the list of all products linked to
this category or to a child of this category.
</p>
</field>
</record>
@可以看到:<field name="view_type">tree</field>
@視圖中用到 <field name="field_parent">child_id</field>
* 搜索視圖
代碼如下(產品模板的搜索視圖):
<record id="product_template_search_view" model="ir.ui.view">
<field name="name">product.template.search</field>
<field name="model">product.template</field>
<field name="arch" type="xml">
<search string="Product">
<!--產品搜索-->
<field name="name" string="Product" filter_domain="['|',('default_code','ilike',self),('name','ilike',self)]"/>
<!--過濾-->
<filter string="Services" icon="terp-accessories-archiver" domain="[('type','=','service')]"/>
<filter string="Consumable" name="consumable" icon="terp-accessories-archiver" domain="[('type','=','consu')]" help="Consumable products"/>
<separator/>
<!--可銷售-->
<filter string="Can be Sold" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
<!--產品分類-->
<field name="categ_id" filter_domain="[('categ_id', 'child_of', self)]"/>
<field string="Product Variant" name="product_variant_ids" filter_domain="['|', ('product_variant_ids.name','ilike',self), ('product_variant_ids.attribute_value_ids.attribute_id.name','ilike',self)]"/>
<!--公司-->
<field name="company_id"/>
<!--價格表-->
<field name="pricelist_id" widget="selection" context="{'pricelist': self}" filter_domain="[]" groups="product.group_sale_pricelist"/> <!-- Keep widget=selection on this field to pass numeric `self` value, which is not the case for regular m2o widgets! -->
<group expand='0' string='Group by...'>
<!--分類-->
<filter string='Category' domain="[]" context="{'group_by' : 'categ_id'}"/>
<!--默認計量單位-->
<filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'uom_id'}"/>
<!--類型-->
<filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
</group>
</search>
</field>
</record>
# <search>
上面用於搜索字段 name default_code
field元素定義的屬性
name 字段標識名
string 標簽名
operator 操作符
filter_domain 對應字段如何對輸入內容搜索
上面的例子基於name字段搜索時,輸入框內容和 name 和 default_code都比較
有一個滿足就可以
context 添加上下文
groups 指定用戶權限可見
widget 物件(selection 僅為 Many2one 字段)
domain 過濾條件(用於Mnay2one字段)
filter元素支持屬性(過濾器)
name 指定動作標識符 (在模型中會定義的方法名)
string 標簽名
domain 過濾記錄按條件
content 上下文
helper 提示信息
groups 指定用戶權限可見
icon 小圖標
separator 用於分隔
group 用於分組
它的單項類似filter,但重點用了context來分組
* 日歷視圖
<record id="view_calendar_todo_task" model="ir.ui.view">
<field name="name">view_calendar_todo_task</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<calendar date_start="date_deadline" color="user_id"
display="[name], Stage [stage_id]">
<!-- Fields used for the text of display attribute -->
<field name="name"/>
<field name="stage_id"/>
</calendar>
</field>
</record>
#<calendar>
date_start 開始日期
date_stop 結束日期
date_delay 延期
color 用顏色的實體
event_open_popup 用彈出容器代替表單視圖
quick_add
all_day 總天數
display 顯示文字
attendee 出席人
* 甘特視圖
<record id="view_gantt_todo_task" model="ir.ui.view">
<field name="name">view_gantt_todo_task</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<gantt date_start="date_deadline"
default_group_by="user_id"/>
</field>
</record>
#<gantt>
date_start 開始日期
date_stop 結束日期
date_delay 周期
progress 進度百分比
default_group_by 任務分組條件
* 圖表視圖
<record id="view_graph_todo_task" model="ir.ui.view">
<field name="name">view_graph_todo_task</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<graph type="pivot">
<field name="stage" type="col"/>
<field name="user_id"/>
<field name="date_deadline" interval="week"/>
<field name="effort_estimate" type="measure"/>
</graph>
</field>
</record>
#<graph>
type:bar(默認),pie,line,pivot 圖形類別
stacked: 僅用於 bar
orientation:horizontal,vertical 方向:水平 垂直
字段支持的屬性<field>
name 字段標識名
type 分組方式,默認是row 行 ,設定可以是col列,measure
interval 時間度量 day,week,month,quarter 或 year
* 看板
todo_task.py
-----------------------------
# -*- coding: utf-8 -*-
from openerp import models, fields
class TodoTask(models.Model):
_inherit = 'todo.task'
priority = fields.Selection(
[('0', 'Low'), ('1', 'Normal'), ('2', 'High')],
'Priority', default='1')
kanban_state = fields.Selection(
[('normal', 'In Progress'),
('blocked', 'Blocked'),
('done', 'Ready for next stage')],
'Kanban State', default='normal')
----------------------------------
todo_view.xml
----------------------------------
<?xml version="1.0"?>
<openerp>
<data>
<!-- Add Kanban view mode to the menu Action: -->
<act_window id="todo_app.action_todo_task"
name=" To-Do Tasks"
res_model="todo.task"
view_mode="kanban,tree,form,calendar,gantt,graph"
context="{'search_default_filter_my_tasks': True}"/>
<!-- Add Kanban view -->
<record id="To-do Task Kanban" model="ir.ui.view">
<field name="name">To-do Task Kanban</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<!-- Empty for now, but the Kanban will go here! -->
<kanban>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_vignette">
<img t-att-src="kanban_image('res.partner','image_medium', record.id.value)"
class="oe_kanban_image"/>
<div class="oe_kanban_details">
<!-- Title and Data content -->
<h4>
<a type="open">
<field name="name"/>
</a>
</h4>
<field name="tags"/>
<ul>
<li>
<field name="user_id"/>
</li>
<li>
<field name="date_deadline"/>
</li>
</ul>
<field name="kanban_state" widget="kanban_state_selection"/>
<field name="priority" widget="priority"/>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
</data>
</openerp>
----------------------------------
# 可用屬性
default_group_by 默認分組
default_order 默認排序字段
class 類名
quick_create
可加載的字元素屬
field字段
name 名稱 sum,avg,min, max, count
template 是一個qweb模板
instance widget record read_only_mode
# 看板視圖的風格
Vignette 就是左邊有一個小插件,在系統中常用於 客戶、產品、等
Card 常用於 CRM中的機會和商機,也用在項目任務
# 看板視圖
<kanban> 頂級元素
常用兩個字段 priority , kanban_state
priority 顯示項目的緊急程度
kanban_state 顯示項目的各階段
<templates> 主要有一個命名 kanban-box 采用下面的元素 <t t-name="kanban-box">...</t>
<field>這是字段,若是只是用於表達,就放在<templates>之前,字段具有聚合性如:
<field name="effort_estimated" sum="Total Effort" />
<kanban> 頂級元素支持一些屬性
default_group_by 默認分組條件
default_order 默認排序條件
quick_create="false" 不能快速創建選項
class 加入css類
css類,有兩個主要的 oe_kanban_vignette 和 oe_kanban_details
<img>中的 t-att-src 可以計算圖片的src存在數據庫中的值
# 在看板視圖中的動作
在<a>中有 type 屬性 像 <button>里面的功能似的
type的值有:
open: 打開表單視圖
edit: 打開並編輯表單視圖
delete: 刪除記錄
#卡片風格的看板視圖
示例代碼:
<t t-name="kanban-box">
<div class="oe_kanban_card">
<div class="oe_dropdown_kanban oe_dropdown_toggle">
<!-- Top-right drop down menu -->
</div>
<div class="oe_kanban_content">
<!-- Option menu will go here! -->
<h4>
<a type="open">
<field name="name"/>
</a>
</h4>
<field name="tags"/>
<ul>
<li>
<field name="user_id"/>
</li>
<li>
<field name="date_deadline"/>
</li>
</ul>
<div class="oe_kanban_bottom_right">
<field name="kanban_state"
widget="kanban_state_selection"/>
</div>
<div class="oe_kanban_footer_left">
<field name="priority" widget="priority"/>
</div>
</div>
</div>
</t>
* 綜合來一例
# 模型 lesson.py
# -*- coding: utf-8 -*-
from openerp import models, fields
class oecn_training_lesson(models.Model):
_name = 'oecn.training.lesson'
_description = u'OECN 培訓課程'
_columns = {
'name':fields.char( u'課程名',size=64,select=True),
'date_start':fields.date(u'開始日期',select=True),
'total_day':fields.float(u'總天數',digits=(16,1)),
'teacher':fields.many2one('res.users',u'授課老師'),
'students':fields.many2many('res.partner',string=u'學生'),
'price':fields.float(u'價格',digits=(16,2)),
}
u后面再加中文,這樣不會亂碼,顯性指明編碼
#視圖lesson_view.xml
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--定義表單視圖-->
<record model="ir.ui.view" id="oecn_training_lesson_form_view">
<field name="name">課程表單</field>
<field name="type">form</field>
<field name="model">oecn.training.lesson</field>
<field name="arch" type="xml">
<form>
<group>
<field name="name"/>
<field name="date_start"/>
<field name="total_day"/>
<field name="price"/>
<field name="teacher"/>
<field name="students" colspan="4"/>
</group>
</form>
</field>
</record>
<!--定義列表視圖-->
<record model="ir.ui.view" id="oecn_training_lesson_tree_view">
<field name="name">課程列表</field>
<field name="type">tree</field>
<field name="model">oecn.training.lesson</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="date_start"/>
<field name="teacher"/>
<field name="price" sum="合計"/>
</tree>
</field>
</record>
<!--定義視圖動作-->
<record model="ir.actions.act_window" id="action_oecn_training_lesson">
<field name="name">課程</field>
<field name="res_model">oecn.training.lesson</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree</field>
<field name="view_id" ref="oecn_training_lesson_tree_view"/>
</record>
<!--定義菜單-->
<menuitem id="oecn_menu" name="OECN"/>
<menuitem id="oecn_training_menu" name="OECN Training" parent="oecn_menu"/>
<menuitem id="oecn_training_lesson_menu" name="OECN Training Lesson" parent="oecn_training_menu"
action="action_oecn_training_lesson"/>
</data>
</openerp>
這樣從菜單到響應完成,打開展開一個表單視圖
視圖動作到了8.0可以用采用 <act_window>標簽來簡寫
====================================
接着繼承插件寫法,給課程分配教室
# 模型 lesson.py
# -*- coding: utf-8 -*-
from openerp import models, fields
class oecn_training_lesson(models.Model):
_inherit = 'oecn.training.lesson'
_columns = {
'classroom_id':fields.many2one('oecn.training.classroom','教室'),#添加一個教室屬性,為多對一對象。
}
教室模型 classroom.py
# -*- coding: utf-8 -*-
from openerp import models, fields
class oecn_training_classroom(models.Model):
_name = 'oecn.training.classroom'
_description = u'OECN 教室'
_columns = {
'number':fields.char(u'編號', size=64, select=True),
'capacity':fields.integer(u'容納人數', select=True),
'location':fields.char(u'地點', size=125, select=True),
}
#視圖lesson_view.xml
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--OECN 教室-->
<record model="ir.ui.view" id="oecn_training_lesson_from_inherit_classroom_view">
<field name="name">課程教室繼承視圖</field>
<field name="type">form</field>
<field name="model">oecn.training.lesson</field>
<field name="inherit_id" ref="oecn_training.oecn_training_lesson_form_view"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="classroom_id"/>
</field>
</field>
</record>
</data>
</openerp>
<field name="inherit_id" ref="oecn_training.oecn_training_lesson_form_view"/>
這句就是繼承,ref指名要繼承的視圖id
后面就找位置
<field name="name" position="after">
<field name="classroom_id"/>
</field>
意思是在要繼承的視圖的name字段后(position="after"),添加一個教室字段。
# 教室的視圖
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--OECN 教室-->
<record model="ir.ui.view" id="oecn_training_classroom_from_view">
<field name="name">教室</field>
<field name="type">form</field>
<field name="model">oecn.training.classroom</field>
<field name="arch" type="xml">
<field name="number"/>
<field name="capacity"/>
<field name="location" />
</field>
</record>
<!--定義列表視圖-->
<record model="ir.ui.view" id="oecn_training_classroom_tree_view">
<field name="name">教室列表</field>
<field name="type">tree</field>
<field name="model">oecn.training.classroom</field>
<field name="arch" type="xml">
<field name="number"/>
<field name="capacity"/>
<field name="location" />
</field>
</record>
<!--定義視圖動作-->
<record model="ir.actions.act_window" id="action_oecn_training_classroom">
<field name="name">教室</field>
<field name="res_model">oecn.training.classroom</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree</field>
<field name="view_id" ref="oecn_training_classroom_tree_view"/>
</record>
<menuitem id="oecn_training_classroom_menu" name="OECN Training Classroom"
parent="oecn_training.oecn_training_menu" action="action_oecn_training_classroom"/>
</data>
</openerp>
* 代碼分析時有用點
<!--僅在編輯時顯示標簽-->
<label for="name" class="oe_edit_only"/>
<!--多公司時顯示公司名-->
<field name="company_id" groups="base.group_multi_company" widget="selection"/>
* css的運用
oe_grey:灰色
<p class="oe_grey">Select the places where this route can be selected</p>
* 設置context的值
<filter name="show_inactive" string="Show inactive" context="{'active_test': False}" />
這樣表示,不測試 active這個字段 顯示列表數據,系統默認所有在列表時,若有active這個字段
顯示是都是 active 為t時才能顯示出來
<field name="name" context="{default_name:'hello'}" /> 設置默認值