(04)odoo視圖操作


-----------------
更新時間
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'}" /> 設置默認值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM