Packer.Odoo.10---Chapter 6

視圖層-設(shè)計用戶界面

這一章節(jié)我們會學(xué)習(xí)用來構(gòu)建用戶界面的視圖層蜈膨。

  • 視圖跟控件
  • context跟domian

使用xml文件定義用戶界面

用戶界面與業(yè)務(wù)記錄一樣,都是存儲在我們Odoo的數(shù)據(jù)庫中丧叽。我們設(shè)計用戶界面其實本質(zhì)上就是使用xml文件來把Odoo中的UI從數(shù)據(jù)庫中拉出來顯示給用戶。
構(gòu)造一個新的 todo_ui 模塊.編輯__mainfest__.py文件:

{
    'name': 'User interface improvements tp the To-Do app',
    'description': 'User friendly features.',
    'author': 'xer',
    'depends': ['todo_user'],
    'data': ['views/todo_view.xml',
             'views/todo_menu.xml',
             'security/ir.model.access.csv',
             ],
}

菜單選項

菜單選項被存貯在ir.ui.menu模型中.可以在** Settings | Technical | User Interface | Menu Items**中查看
我們在'todo_app'應(yīng)用中已經(jīng)創(chuàng)建了頂層菜單'To-Do app tasks'.現(xiàn)在來對這個菜單進(jìn)行擴(kuò)展
新建views/todo_menu.xml.添加如下代碼

     <!--Modify the top menu-->
    <menuitem id="todo_app.menu_todo_task" name="To-Do"></menuitem>
    <!--app menu items-->
    <menuitem id="menu_todo_task_view"
              name="Tasks"
              parent="todo_app.menu_todo_task"
              sequence="10"
              action="todo_app.action_todo_task"/>
    <menuitem id="menu_todo_config"
              name="Configuration"
              parent="todo_app.menu_todo_task"
              sequence="100"
              groups="base.group_system"/>
    <menuitem id="menu_todo_task_stage"
              name="Stages"
              parent="menu_todo_config"
              sequence="10"
              action="action_todo_stage" />

Odoo的縮寫可以直接使用<menuitem>這個標(biāo)簽來代替<record mode='ir.ui.view'>

  • 第一行中我們直接使用了定義在'todo_app'中的菜單視圖的外部xml id.直接對其進(jìn)行改寫
  • 第二行通過'parent'屬性來定義二級菜單,使用action來調(diào)用菜單動作.
  • 第三行我們定義了一個設(shè)置菜單,規(guī)定了group為管理員才能獲取.
  • 最后,我們添加了Stage菜單.綁定action用來顯示任務(wù)的階段.

窗口動作(actions)

窗口動作通常與菜單以及按鈕結(jié)合使用公你,它在GUI客戶端中調(diào)度每個窗口踊淳。通過domian過濾器能顯示記錄中符合條件的子集,通過context可以傳遞參數(shù)陕靠。

    <act_window id="action_todo_stage"
                name="To-Do Task Stages"
                res_model="todo.task.stage"
                view_mode="tree,form"
                target="current"
                context="{'default_state': 'open'}"
                domain="[]"
                limit="80"
                />
    <act_window id="todo_app.action_todo_task"
                name="To-Do Tasks"
                res_model="todo.task"
                view_mode="tree,form,calendar,kanban,graph,pivot"
                target="current"
                context="{'search_default_filter_my_tasks': True}"
                />
    <act_window id="action_todo_task_stage"
                name="To-Do Task Stages"
                res_model="todo.task.stage"
                src_model="todo.task"
                multi="False"
                />

我們在'views/todo_menu.xml'中添加窗口動作,注意要把這些元素放在menu元素之前.窗口動作被存貯在'ir.actions.act_window'模型中,可使用縮寫<act_window>.
上面代碼第一個action我們打開了Task Stages模型.其中主要屬性如下所列:

  • name: 在視圖層顯示的動作的名稱.
  • res_model : 動作要調(diào)用的模型
  • view_mode: 視圖顯示模式迂尝。第一個模式是默認(rèn)打開時的顯示方式
  • target: new能打開新窗口,默認(rèn)是current剪芥,即在當(dāng)前頁面打開
  • context: 在目標(biāo)視圖打開時垄开,提供傳遞的參數(shù)(傳遞上下文)。通常用來設(shè)置默認(rèn)值以及添加過濾
  • domain:domain過濾規(guī)則粗俱。
  • limit: 每頁顯示的記錄數(shù)说榆。
    第二個action我們重新定義了todo_app中的動作,添加了多種視圖表示模式
    第三個動作并沒有綁定菜單.這個動作是注冊到了我們視圖層右上角的more選項中.
  • src_model :指定了在哪個模型中放置More菜單
  • multi: 這個屬性默認(rèn)為false,當(dāng)設(shè)置為True時能夠在list視圖中使用(注意到我們的More菜單只在點開具體task記錄時才可以使用)
    右上角的more

Context(上下文)跟domain

Context 數(shù)據(jù)

上下文數(shù)據(jù)是一個保存著會話信息的字典能夠同時在用戶界面跟業(yè)務(wù)后臺中傳遞數(shù)據(jù)寸认。

  • 從用戶界面角度:它能把前一個視圖中的數(shù)據(jù)签财,例如記錄ID傳遞到下一個視圖。為下一個視圖傳遞默認(rèn)值
  • 從服務(wù)器角度:一些記錄集字段的值依賴于Odoo的本地設(shè)置偏塞,也可以使用context傳遞唱蒸。特別是lang的值,它是翻譯的關(guān)鍵.舉個例子:
{'lang': 'en_US', 'tz': 'Europe/Brussels', 'uid': 1}
  • 當(dāng)打開一個表單視圖或者從按鈕上獲取一個鏈接,active_id被添加到context中.它代表了當(dāng)前記錄的id,如果是列表視圖,則會有一個active_ids包含列表中所有的記錄.
  • 如果要設(shè)置默認(rèn)值,要通過default_或者default_search_前綴.舉例:
    設(shè)置默認(rèn)user_id字段的值
{'default_user_id' : uid}

設(shè)置一個默認(rèn)的過濾器:

{'default_search_filter_my_tasks' : 1}

Domain表達(dá)式

domian表達(dá)式是用來過濾數(shù)據(jù)記錄的灸叼。它本質(zhì)是通過Odoo的ORM模型轉(zhuǎn)換為SQL的WHERE子句神汹。domain表達(dá)式的每個條件是一個三元素的元組格式:('field_name','operator','value')

  • field_name: 是要被過濾的字段名稱庆捺。能夠使用.操作符來表示關(guān)聯(lián)模型的字段.
  • value : 必須能通過操作符跟字段進(jìn)行比較。
  • operator: 操作符屁魏。常見的如<,>,<,>=,=,!=
    • =like:可以使用模式匹配滔以,下劃線“_”匹配一個字符,百分號“%”匹配零或者多個字符氓拼。
    • like: %value%模式你画,模糊搜索。ilikelike類似,忽略大小寫.not like桃漾,通過%value%模式不匹配
    • child of:判斷是否value的子記錄坏匪,通過_parent_name實現(xiàn)。
    • in, not in:判斷value是否在元素的列表里面撬统。
      domain表達(dá)式是一個列表适滓,通常包含了許多個條件元組,這些條件元組直接默認(rèn)的邏輯關(guān)系是AND恋追。
      條件間使用的邏輯前綴:

& :邏輯 AND凭迹,條件間的默認(rèn)關(guān)系。2個參數(shù)(后2個條件或者條件組合) 几于,例如:

['&', ('partner_id.coutnry_id.code', '=', 'CN'), ('partner_id.coutry_id.code', '=', 'US')]

這里的 & 就是把后面的2個條件通過AND組合起來也就是 A AND B蕊苗,但是注意到這里說的是還有“條件組合”的情況,所以還有可能是

['&', ('partner_id.coutnry_id.code', '=', 'CN'), 
'&',('partner_id.coutry_id.code', '=', 'US'), ('partner_id.coutry_id.code', '=', 'GB')]

轉(zhuǎn)換為一般的表示方法則是 A AND (B AND C)沿彭,但是因為’&’是默認(rèn)的邏輯關(guān)系,所以我們其實可以不用顯式表示

[('partner_id.coutnry_id.code', '=', 'CN'),('partner_id.coutry_id.code', '=', 'US'), 
('partner_id.coutry_id.code', '=', 'GB')]

更多的Domain討論可以在 Domain規(guī)則中看到


表單視圖

form視圖就像紙質(zhì)文件一樣尖滚,有著簡單的布局喉刘。
我們可以對它進(jìn)行布局的設(shè)置,現(xiàn)在讓我們通過繼承來擴(kuò)展在todo_app中定義過的form視圖.

處理相同類型的多個視圖.

同一個模型可能會有多個視圖,通過添加action的屬性view_id,可以指定需要使用的視圖.
Odoo為我們的模型提供了最為基礎(chǔ)的form視圖,當(dāng)我們進(jìn)行視圖的修改后,Odoo會通過優(yōu)先值來調(diào)用新視圖.默認(rèn)的視圖優(yōu)先級為16.

業(yè)務(wù)文檔視圖

正常業(yè)務(wù)使用中,許多記錄都被記錄在紙質(zhì)文件上,例如發(fā)票,庫存單.因此構(gòu)建一張類似紙質(zhì)文件的視圖是十分有必要的.在我們的To-Do Task中,創(chuàng)建views/todo_views.xml文件.

    <record id="view_form_todo_task_ui"
            model="ir.ui.view">
        <field name="model">todo.task</field>
        <field name="priority">15</field>
        <field name="arch" type="xml">
            <form>
                <header>
                <!-- To add buttons and status widget-->
                </header>
                <sheet>
                   <!-- To add form content-->
                </sheet>
                <div class="oe_chatter">
                    <field name="message_follower_ids"
                           widget="mail_followers"/>
                    <field name="message_ids" widget="mail_thread"/>
                </div>
            </form>
        </field>
    </record>

業(yè)務(wù)文檔視圖通常使用3個主要區(qū)域漆弄。

  • header:狀態(tài)條
  • sheet: 主要內(nèi)容
  • chatter:底部防止留言板一類的界面顯示
    我們在chatter中使用了Odoo中mail模塊的社交網(wǎng)絡(luò)組件睦裳。
header

通常我們在頁面頭部中放置動作按鈕以及頁面的生命周期狀態(tài)。
通常action是通過放置button按鈕來實現(xiàn)的撼唾。通常使用`class="oe_highlight"可以使其高亮顯示
文檔記錄的生命周期使用'statusbar'這個窗口組件.一般使用'State'名稱的selection字段或者一個'Stage'名字的多對一字段來表示文件記錄當(dāng)前的狀態(tài).
按照目前Odoo的趨勢.逐漸使用Stage代替State來表示記錄狀態(tài).
在todo_view.xml中擴(kuò)展我們的header

                <header>
                    <field name="state" invisible="True"/>
                    <button name='do_toggle_done' type="object"
                            attrs="{'invisible':[('state','in',['draft'])]}"
                            string="Toggle Done"
                            class="oe_highlight"/>
                    <field name="stage_id"
                           widget="statusbar"
                           clickable="True"
                           options="{'fold_field':'fold'}"/>
                </header>

我們使用字段前廉邑,首先需要把該字段導(dǎo)入到view中。
上面的代碼中倒谷。首先我們把記錄的state字段設(shè)置為不可見蛛蒙,可以設(shè)置屬性invisible="True"讓字段在客戶界面不顯示.
下面定義一個button按鈕來觸發(fā)以前定義過的do_toggle_done方法.屬性"attrs"的定義是指當(dāng)文檔記錄的state狀態(tài)為draft時隱藏該按鈕.
clickable屬性允許通過點擊status bar來改變文檔記錄的stage字段值.

Sheet

sheet 標(biāo)簽中主要是實際數(shù)據(jù)存放的地方,它被設(shè)計成跟紙質(zhì)文檔類似的格式渤愁。它的主要結(jié)構(gòu):

  • 居中的文檔標(biāo)題
  • 右上角的一個按鈕盒
  • 其他文檔頭部字段
  • 一個用來記載額外字段的筆記本

標(biāo)題跟副標(biāo)題

<group>元素外的字段不會自動生成標(biāo)注牵祟。所以我, 需要為這些標(biāo)題元素添加label屬性抖格。Odoo的xml文件中可以使用html跟css語言诺苹。我們一般把標(biāo)題放在<div class='oe_title'>標(biāo)簽下咕晋。

                <sheet>
                    <div class="oe_title">
                        <label for="name" class="oe_edit_only"/>
                        <h1><field name="name"/></h1>
                        <h3>
                            <span class="oe_read_only">By</span>
                            <label for="user_id" class="oe_edit_only"/>
                            <field name="user_id" class="oe_inline"/>
                        </h3>
                    </div>
                </sheet>

<label>的用法.for屬性指定了需要的字段.class="oe_edit_only"表示只在編輯模式時顯示該字段.

巧妙的按鈕區(qū)域

右上角有一個按鈕存放的區(qū)域。我們可以在其中添加按鈕.

<div name="buttons" class="oe_right oe_button_box">
<!-- smart buttons here ...-->
</div>

我們表單的主要內(nèi)容應(yīng)該放置在<group>標(biāo)簽中.一個字段值跟一個字段標(biāo)簽通常需要兩列收奔,而一個<group>標(biāo)簽會在頁面布局上插入兩列掌呜。所以我們使用2個group標(biāo)簽,這樣就可以構(gòu)造左右兩個字段的布局格式坪哄。

                    <group name="group_top">
                        <group name="group_left">
                            <field name="date_deadline"/>
                            <!--<separator string="Reference"/>-->
                            <field name="refers_to"/>
                        </group>
                        <group name="group_right">
                            <field name="tag_ids" widget="many2many_tags"/>
                            <field name="stage_state"/>
                        </group>
                    </group>

效果如下:

group效果

我們在定義group標(biāo)簽時质蕉,可以定義一個name屬性,這有利于關(guān)聯(lián)以及以后的擴(kuò)展.

在group標(biāo)簽中我們可以使用col,colspan屬性來對布局進(jìn)一步的控制.

  • col代表group分割的列數(shù),默認(rèn)為2.
  • colspan表示每列的尺寸大小

分頁筆記本

另一種格式化內(nèi)容的方式是使用notebook元素.包含多重分頁節(jié)選。它能讓不常用的數(shù)據(jù)在使用時才顯示损姜。
例子:

<notebook>
<page string="Whiteboard" name="whiteboard">
  <field name="docs"/>
</page>
<page>
<!--second page content -->
</page>
</notebook>

視圖語義組件

剛才我們解釋了如何結(jié)構(gòu)化表單內(nèi)容∈伟現(xiàn)在我們來講講構(gòu)造表單數(shù)據(jù)的部件。

Fields

視圖中字段同樣有許多屬性摧阅,我們可以通過定義這些屬性來重寫模型中已經(jīng)定義的字段的屬性汰蓉。

  • name : 字段數(shù)據(jù)庫名字的標(biāo)識
  • string : 標(biāo)簽文本。在view中定義可以重寫模型中已經(jīng)定義的string名字
  • help :幫助文本棒卷,鼠標(biāo)懸停時顯示
  • placeholder : 在創(chuàng)建時字段輸入框中默認(rèn)顯示的內(nèi)容顾孽。
  • widget : 字段顯示的窗口化部件。
  • options :一個JSON數(shù)據(jù)類型的可選參數(shù)比规,用來給窗口化部件傳參若厚。
  • class :CSS樣式
  • nolabel="True" :在groups視圖中不顯示字段的標(biāo)簽常用。
  • invisible="True" : 字段不可見
  • readonly="True" : 字段在視圖中只讀
  • required="True" : 字段必須輸入
  • password="True" : 字段輸入變?yōu)?*"這樣的密碼格式
  • filename : 二進(jìn)制文件,上傳后保存的名字
  • mode : 一對多字段使用,它指定了一對多字段在關(guān)聯(lián)字段中顯示的模式,默認(rèn)是tree,可以為form,kanban,graph.

字段的標(biāo)簽

label元素通常用來控制字段在視圖中的顯示.

<label for="name" class="oe_edit_only" />

表示只有當(dāng)處于編輯模式時才顯示字段標(biāo)簽蜒什。
注意测秸,在group元素內(nèi)嵌中,我們還要設(shè)置nolabel="True".

關(guān)系字段

關(guān)系字段可用的屬性有 context,domain.這些已經(jīng)介紹過.還有一個options屬性.我們知道,在關(guān)系型字段上,我們能夠使用快速創(chuàng)建功能來快速創(chuàng)建一個新的關(guān)聯(lián)模型記錄,通過

options={'no_open': True, 'no_create' : True}

可以關(guān)閉快速創(chuàng)建功能.

字段窗口控件

字段根據(jù)自己的類型都有默認(rèn)的窗口顯示控件.當(dāng)我們還可以自己來選擇額外的窗口顯示控件.

對于字符型字段:

  • email : 用來添加一個"發(fā)送給..."的動作
  • url : 格式化文本為一個可以點擊的URL地址
  • html : 一個可以轉(zhuǎn)換text到HTML內(nèi)容的控件
    對于數(shù)字字段:
  • handle : 對于排序字段灾常,直接顯示向上向下箭頭
  • float_time : 單精度時間
  • monetary :價格(和精度位數(shù)相關(guān))
  • progressbar :精度條霎冯,按照百分比。

關(guān)系型字段:

  • many2many_tags : 展示一個類似按鈕標(biāo)簽的列表
  • selection : 使用了selection 字段部件來展示many-to-one 字段
  • radio : 單選標(biāo)簽
  • kanban_state_selection :
  • priority : 優(yōu)先級钞瀑。通常就是個數(shù)字沈撞。

按鈕

按鈕支持下面的屬性:

  • icon : 定義圖標(biāo)按鈕。只能在addons/web/static/src/img/icons中獲取

  • string : 按鈕的字符描述

  • type : 一共有3個值:
    1. workflow : 觸發(fā)工作流
    2. object : 調(diào)用python方法
    3. action : 執(zhí)行窗口動作

  • name : 根據(jù)type的取值來設(shè)置.如果是工作流,就是一個工作流信號名稱, object就是python方法名,action就是動作的外部id

  • args : 當(dāng)type參數(shù)是object時用來傳遞參數(shù)

  • context : 添加上下文內(nèi)容.

  • confirm : 確認(rèn)按鈕上顯示的字符

  • special="cancel" : 在向?qū)е惺褂?用來取消向?qū)П韱位蛘哧P(guān)閉向?qū)б晥D.

巧妙(Smart)按鈕

就是表單結(jié)構(gòu)中右上角的按鈕小盒子.

image.png

在我們的app中雕什,我們定義了了一個展示當(dāng)前task總數(shù)的按鈕,點擊它會直接列出當(dāng)前用戶的task列表記錄.

首先在 todo_model.py 文件中添加統(tǒng)計task的計算字段,

    def compute_user_todo_count(self):
        for task in self:
            task.user_todo_count = task.search_count([('user_id', '=', task.user_id.id)])

    user_todo_count = fields.Integer('User To-Do Count', compute='compute_user_todo_count')

然后在視圖層添加button按鈕

                    <div name="buttons" class="oe_right oe_button_box">
                        <button class="oe_stat_button"
                                type="action" icon="fa-tasks"
                                name="%(action_todo_task_button)d"
                                context="{'default_user_id': user_id}"
                                help="All to-dos for this user">
                            <field string="To-Dos" name="user_todo_count"
                                   widget="statinfo"/>
                        </button>

添加 smart buttons 時,有下列屬性可以使用:

  • class="oe_stat_button" :
  • icon : 設(shè)置按鈕使用的圖標(biāo)
  • typename : smart button中, type 通常就是 actionname 的記錄則是XMLID, 這里我們就需要使用 %(action-external-id)d 來讓外部id轉(zhuǎn)為實際的數(shù)據(jù)庫id.
  • string :添加文本標(biāo)志.
  • context : 傳遞上下文,代碼中我們傳遞了用戶的id作為action打開下一個視圖的默認(rèn)值.
  • help : 幫助文本信息
    button 元素可以被看做一個容器缠俺,我們是有statinfo 這個小組件來展示字段的統(tǒng)計信息。代碼中我們顯示了一個計算字段贷岸。另外還可以在其中放入靜態(tài)文本字段 舉例:
<div> User's To-dos </div>

下面來完善我們定義的action_todo_task_button 這個動作.它必須在button 之前定義

    <act_window id="action_todo_task_button"
                name="To-Do Tasks"
                res_model="todo.task"
                view_mode="tree,form,calendar,graph,pivot"
                domain="[('user_id','=',default_user_id)]"
    />

動態(tài)視圖

視圖元素提供了一些屬性同樣允許視圖根據(jù)字段的值的變化來動態(tài)的展示對應(yīng)的視圖壹士。

on change 事件

Odoo 提供的on change 機(jī)制通過監(jiān)測字段的值的改變來對目標(biāo)字段的值進(jìn)行改變。舉個例子凰盔,價格字段隨著產(chǎn)品字段的選擇的改變而產(chǎn)生變化來顯示具體產(chǎn)品的價格墓卦。
從Odoo8.0版本以后,on change 可以直接在模型python代碼中實現(xiàn)户敬。通過@api.onchange('field1', 'field2') 來實現(xiàn).

動態(tài)屬性

動態(tài)屬性能夠更好的通過 on change 機(jī)制來對用戶視圖上元素的可視化進(jìn)行控制.

  • group : 讓一個元素是否可見依賴當(dāng)前用戶的分組.其實是通過權(quán)限控制實現(xiàn).

    • states* : 根據(jù)當(dāng)前記錄的 Stage 字段.

視圖模式

  • List View(列表視圖):
    <record id="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 colors="red:is_done==True">
                <field name="name"/>
                <field name="is_done"/>
            </tree>
        </field>
    </record>

對應(yīng)屬性:

  1. default_order : 默認(rèn)的排序規(guī)則.
  2. create,delte,edit : 如果設(shè)置為 false ,讓對應(yīng)的視圖上的動作失效.
  3. editable : 讓記錄能夠在列表視圖中直接被修改.
    列表視圖中落剪,數(shù)字型字段能夠通過使用 sum睁本, avg, min忠怖, max 屬性來對每列的數(shù)據(jù)進(jìn)行一個統(tǒng)計操作呢堰。
<field name="amount" sum="Total Amount"/>
  • 搜索視圖
    搜索視圖被定義在<search>標(biāo)簽中.
    <record id="todo_app.view_filter_todo_task"
            model="ir.ui.view">
        <field name="model">todo.task</field>
        <field name="arch" type="xml">
            <search>
                <field name="name" />
                <field name="user_id"/>
                <filter name="filter_not_done" string="Not Done"
                       domain="[('is_done','=',False)]"/>
                <filter name="filter_done" string="Done"
                       domain="[('is_done','!=',False)]"/>
                <separator/>
                <filter name="group_user" string="By User"
                        context="{'group_by':'user_id'}"/>
            </search>
        </field>
    </record>

我們使用了 nameuser_id 字段進(jìn)行搜索.
搜索視圖屬性:

  1. name : 標(biāo)識了使用的字段.
  2. string : 字符標(biāo)識
  3. operator : 操作方式,數(shù)字類型字段默認(rèn)為=, 其他的是ilike.
  4. filter_domain : 過濾規(guī)則.提供一個可以選擇的現(xiàn)成過濾器小方塊顯示在搜索欄下拉菜單中.
  5. groups : 根據(jù)使用者的分組決定搜索權(quán)限.

對于過濾器元素.以下屬性可以使用:

  1. name : 定義了過濾器的標(biāo)識id.
  2. string : 過濾器在視圖中的字符標(biāo)識.
  3. domain : domain過濾規(guī)則.
  4. context : 上下文傳遞數(shù)據(jù).
  5. groups : 根據(jù)當(dāng)前用戶分組權(quán)限決定是否顯示本過濾器.
  • 日歷視圖
   <record id="view_calendar_todo_task" model="ir.ui.view">
       <field name="model">todo.task</field>
       <field name="arch" type="xml">
           <calendar date_start="date_deadline" color="user_id"
                     display="[name], Stage [stage_id]">
               <field name="name"></field>
               <field name="stage_id"/>
           </calendar>
       </field>
   </record>

日歷視圖屬性:

  1. date_start : 開始日期。
  2. date_end : 結(jié)束日期.
  3. date_delay : 持續(xù)時間,可以用來代替date_end .很好理解凡泣,end - start = delay嘛枉疼。
  4. all_day : 一個bool字段來決定是否是全天持續(xù)事件.
  5. color : 根據(jù)分組來設(shè)置一個顯示顏色
  6. display : 顯示的格式. 代碼中就是顯示記錄的名字跟階段狀態(tài)。
  7. mode :顯示模式鞋拟,默認(rèn)是 day, week, month
  • 圖表視圖跟數(shù)據(jù)透視表
    圖表視圖為數(shù)據(jù)提供了圖像可視化骂维。
    todo_ui/models/todo_model.py中task模型中添加一個字段
    effort_estimate = fields.Integer('effort estimate')
    <record id="view_graph_todo_task" model="ir.ui.view">
        <field name="model">todo.task</field>
        <field name="arch" type="xml">
            <graph type="bar">
                <field name="stage_id"/>
                <field name="effort_estimate" type="measure"/>
            </graph>
        </field>
    </record>

圖表的type 有3個可選 bar,pie贺纲,line 航闺。

添加數(shù)據(jù)透視表

    <record id="view_pivot_todo_task" model="ir.ui.view">
        <field name="model">todo.task</field>
        <field name="arch" type="xml">
            <pivot>
                <field name="stage_id" type="col"/>
                <field name="user_id"/>
                <field name="date_deadline" interval="week"/>
                <field name="effort_estimate" type="measure"/>
            </pivot>
        </field>
    </record>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市猴誊,隨后出現(xiàn)的幾起案子潦刃,更是在濱河造成了極大的恐慌,老刑警劉巖懈叹,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乖杠,死亡現(xiàn)場離奇詭異,居然都是意外死亡澄成,警方通過查閱死者的電腦和手機(jī)胧洒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墨状,“玉大人略荡,你說我怎么就攤上這事∏附海” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵巴粪,是天一觀的道長通今。 經(jīng)常有香客問我,道長肛根,這世上最難降的妖魔是什么辫塌? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮派哲,結(jié)果婚禮上臼氨,老公的妹妹穿的比我還像新娘。我一直安慰自己芭届,他們只是感情好储矩,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布感耙。 她就那樣靜靜地躺著,像睡著了一般持隧。 火紅的嫁衣襯著肌膚如雪即硼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天屡拨,我揣著相機(jī)與錄音只酥,去河邊找鬼。 笑死呀狼,一個胖子當(dāng)著我的面吹牛裂允,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哥艇,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼绝编,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了她奥?” 一聲冷哼從身側(cè)響起瓮增,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哩俭,沒想到半個月后绷跑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡凡资,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年砸捏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隙赁。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡垦藏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伞访,到底是詐尸還是另有隱情掂骏,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布厚掷,位于F島的核電站弟灼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冒黑。R本人自食惡果不足惜田绑,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抡爹。 院中可真熱鬧掩驱,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苔可,卻和暖如春缴挖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焚辅。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工映屋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人同蜻。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓棚点,卻偏偏與公主長得像,于是被迫代替她去往敵國和親湾蔓。 傳聞我的和親對象是個殘疾皇子瘫析,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 創(chuàng)建第一個odoo 應(yīng)用 Odoo遵循傳統(tǒng)的MVC模式。我們可以通過創(chuàng)建簡單的To-Do 應(yīng)用來具體介紹分析 mo...
    F4A3閱讀 1,440評論 0 5
  • ORM應(yīng)用邏輯-業(yè)務(wù)處理 前面的章節(jié)我們學(xué)習(xí)了利于Odoo的視圖來構(gòu)建用戶前端界面默责。本章介紹Odoo的后臺業(yè)務(wù)邏輯...
    F4A3閱讀 783評論 0 3
  • 繼承-擴(kuò)展原有的應(yīng)用 Odoo中贬循,有一個非常重要的特色,不用直接修改底層對象就能為我們的模塊添加新的功能桃序。這個特色...
    F4A3閱讀 645評論 0 1
  • 結(jié)構(gòu)化應(yīng)用數(shù)據(jù) 在前面的章節(jié)中杖虾,我們基本接觸了建造Odoo后臺應(yīng)用的所有層面。下面我們就要具體分析‘model媒熊,v...
    F4A3閱讀 537評論 0 0
  • QWeb是Odoo使用的模板引擎奇适。它是基于xml語言編寫的,用來自動生成Html網(wǎng)頁頁面芦鳍。下面就讓我們來學(xué)習(xí)如何使...
    F4A3閱讀 684評論 0 0