Odoo10學習筆記三:模型(結構化的應用數據)、視圖(用戶界面設計)

 

轉載請註明原文地址:http://www.javashuo.com/article/p-szcxdprp-kx.htmlhtml

 

一:模型前端

【Odoo中,一切皆模型,連視圖都是模型。Odoo將各類數據,如:權限數據、類數據、視圖數據等,按照模型分表存儲,而後在查看時,按照索引從各個表格讀取信息,組合成咱們看到的內容。】web

1:建立模型spring

模型屬性:模型類可使用一些屬性來控制它們的一些行爲:數據庫

_name :建立odoo模型的內部標識符,必含項。api

_description :當用戶界面顯示模型時,一個方便用戶的模型記錄標題。安全

_order :當瀏覽模型記錄或者顯示在列表視圖時,設置默認順序。服務器

_rec_name:用來指出引用關聯字描述記錄的字段,例如多對一關係。 默認狀況下,它使用name字段,這是模型中常見的字段。可是這個屬性容許咱們使用任何其餘字段來實現這個目的。session

_table:用來支持模型的數據庫表名。一般,它是左自動計算,是下劃線取代點的模型名稱,但也能夠設置特定的表名。數據結構

_inherit :繼承。

_inherits :嵌入式繼承。

模型深刻:

Odoo模型由Python類表示。

Odoo模型被保存在一箇中央註冊中心,它能夠引用實例中可用的全部模型類,而且它能夠被一個模型名引用。在咱們編寫的模型方法代碼中,能夠經過 self.env['x'] 獲取一個表明model x的類的引用。(至關於spring託管對象)

模型名稱很重要,由於它們是用於訪問註冊中心的。模型名稱的約定規則:用點分隔的小寫字母列表。

模型名稱必須是全局惟一的。正由於如此,第一個詞應該對應於該模塊涉及到的主要應用程序。
瞬態和抽象模型:

絕大多數Odoo模型中,類都是基於models.Model類的。 這種類型的模型具備永久的數據庫持久性:爲它們建立數據庫表,而且它們的記錄被存儲,直到被顯式刪除。

Odoo還提供了另外兩種模型類型:瞬態模型和抽象模型。

瞬態模型基於models.TransientModel類,用於嚮導式的用戶交互。 它們的數據仍然存儲在數據庫中,但指望是臨時的。 一個清理做業按期從這些表中清除舊數據。 
抽象模型基於models.AbstractModel類,而且它不存儲數據。 抽象模型做爲可重用的功能集,利用Odoo的繼承功能,混入到其餘模型。


2:模型之間的關係

命名字段時,有如下約定:以_id、_ids爲結尾命名的字段,分別對應的是2one和2many的關係。

多對一關係:Many2one關係須要兩個參數:關聯模塊和展現字符。它會在數據庫表中建立一個擁有外鍵的字段去關聯數據庫表。其餘參數:
ondelete 在關聯的記錄被刪除時,將會觸發。默認值是null,也就是說,當關聯的記錄被刪除時,它將被置空。其它值爲restrict,當記錄被關聯時,禁止刪除,cascade,刪除關聯記錄的同時刪除當前記錄。
context是一個數據字典,在web客戶端視圖,經過關聯關係訪問時,會將上下文傳過去。好比,設置默認值。它的詳細的介紹,在第六章-視圖-設計用戶界面中。
domain是一個由多個元組組成的列表的域表達式,用來刪選關聯字段中有效的記錄。
auto_join=True使用這個參數後,將容許ORM在數據查詢是使用SQL的join(拼接,級聯)功能。
多對多關係:Many2many 最少要提供一個參數,也就是關聯的模塊,建議再使用string參數,以便更好的標題展現。
多對多關係的存儲:在數據庫層面,數據庫表中是不會添加任何字段。它會自動的建立一個新的中間表,這個表只有兩個外鍵ID字段,而且這兩個字段分別關聯對應的數據庫表。

一對多反向關係:One2many按順序接收3個參數:關聯的模塊,關聯模塊的字段名稱,標題文本。最開始的兩個參數一般是模塊名和相反關係對應的外鍵字段名。
分層關係:樹型存儲。

_parent_store = True
# _parent_name = 'parent_id'
parent_id = fields.Many2one('todo.task.tag', 'Parent Tag', ondelete='restrict')
parent_left = fields.Integer('Parent Left', index=True)
parent_right = fields.Integer('Parent Right', index=True)
#添加一個子記錄
child_ids = fields.One2many('todo.task.tag', 'parent_id', 'Child Tags')


3:計算字段

要建立計算字段,須要設置它的compute屬性爲方法名。這個計算方法經過計算self的每條記錄來設置字段的值。

注意
self是一個記錄的有序集合,它支持標準的Python集合操做,如len(self)iter(self),加上額外的集合操做recs1 + recs2。迭代過程逐個提供self記錄,其中每一個記錄自己是大小爲1的集合。你能夠經過點記號來訪問/分配單個記錄上的字段record.name

計算字段就像常規字段同樣聲明,可是有額外的compute參數,參數值是一個函數名,在函數中計算值並返回。

字段= fields.XX(compute='函數名')
@api.depends('參數')
def 函數(self):
    操做


當計算依賴於其餘字段時,須要@api.depends裝飾器。

計算字段的值一般取決於所在記錄行的其它字段的值。ORM層指望開發人員使用depends()裝飾器來指定計算方法的依賴性。當某些依賴關係被修改後,ORM層經過給定的依賴關係來觸發字段的從新計算

一種用法:統計一對多字段的長度,獲得關聯人數:

attendees_count = fields.Integer(string="Attendees count", compute='_get_attendees_count', store=True)
@api.depends('attendee_ids')
def _get_attendees_count(self):
    for r in self:
        r.attendees_count = len(r.attendee_ids) //根據關聯字段的長度,獲得出席人數

onchange:【onchange至關於前端的js函數!】

"onchange"機制爲客戶端界面提供了一種方法:當用戶在字段中填寫了值,不須要向數據庫保存任何內容,就能夠更新表單。

例如,假設模型有三個字段amount,unit_priceprice,當數量和單價改變時,自動從新計算價格,並在表單界面更新。要實現這個需求,須要定義一個方法,並使用onchange()裝飾器,onchange()的參數指定了在那個字段改變時,觸發方法。其中self表明表單視圖中的記錄,你所作的任何更改,self都將馬上反應在表單上。 

onchange也能夠用於檢測字段變化值是否合法。

 

搜索與寫入:

計算字段能夠經過計算獲得字段值,但此時只能被讀取顯示,還不能被搜索或者寫入。爲此,咱們須要實現函數,並經過字段的search參數、inverse參數來實現該字段的搜索與寫入定義。

複製代碼
複製代碼
字段= fields.XX(

string='展現名',

compute='計算函數',

search='搜索函數',

inverse='寫入函數')


def 搜索函數(self, 參數):

    return [('搜索條件', operator, value)]
def 寫入函數(self): self.字段 = self.寫入值
複製代碼
複製代碼

存儲計算字段:經過設置「store= true」的定義,計算字段的值也能夠存儲在數據庫中。

 

4:關聯字段

字段 = fields.XX(

related='關聯模型.關聯字段',

string='展現名')

 

5:模型約束

Python約束檢查函數應該使用@api.constraints(被約束字段) 修飾,說明被檢查的字段的列表。當其中任何一個被修改,而且在條件失敗時將會拋出一個異常,驗證就會被觸發。

@api.constrains('字段名')
def 驗證函數(self):
    if 條件:
    raise ValidationError('驗證錯誤信息!')

 

6:self.env

複製代碼
複製代碼
self.env 對象給出了訪問請求參數和其餘有用的信息:

self.env.cr 或者 self._cr是數據庫遊標對象,一般用於查詢數據庫
self.env.uid或者self._uid是當前用戶的數據庫ID
self.env.user是當前用戶記錄
self.env.ref(xml_id)返回XML ID對應的記錄
self.env[model_name]返回給定模型的實例
複製代碼
複製代碼

 

二:視圖

用戶界面的每一個組件都以記錄的形式存儲在數據庫中,模塊從XML文件加載相應的數據時會向數據庫添加UI元素,而後odoo從數據庫讀取UI元素進行顯示。

菜單項:

<menuitem>快捷元素,提供了一種縮減方式來定義要加載的記錄,咱們可使用它來代替<record model =「ir.ui.menu」>元素。

頂級菜單項:只有id和name屬性。

子菜單項:經過parent =「上層菜單id」屬性置於上層菜單下。

菜單動做:經過action =「act_window」屬性,把點擊菜單的動做指定爲act_window中打開某個視圖(如tree/form)

菜單分組:使用groups屬性使其僅對某些安全組可見。

 

窗口動做:

給出GUI客戶端指令,一般供視圖中的菜單項或按鈕調用。

它告訴GUI應該使用什麼模型,以及提供哪些視圖。 這些操做可使用domain過濾器強制只有一部分記錄可見。 他們還能夠經過context屬性設置默認值和過濾器。

窗口動做存儲在ir.actions.act_window模型中,可使用<act_window>快捷標籤在XML文件中定義。

主要屬性有:

複製代碼
複製代碼
name:經過此操做打開的視圖中顯示的標題。
res_model:目標模型的標識符ID
view_mode:要打開的視圖類型和它們的順序。 第一個是默認打開的。
target:若是設置爲new,將在彈出的對話框窗口中打開視圖。 默認值爲current,在主內容區域中打開視圖。
context:設置關於目標視圖的上下文信息,上下文中能夠設置默認值或激活過濾器以及其餘信息。
domain:域表達式,強制過濾在打開的視圖中可瀏覽的記錄。
limit:列表視圖中每一個頁面的記錄數。

src_model:應該在什麼模型上此動做可用。

  multi:當設置爲True時,使它在列表視圖中可用,以便它能夠應用於多條選中的記錄。 默認值爲False。

複製代碼
複製代碼

 

上下文與域:

context屬性值:上下文是一個包含session數據的字典,它能夠被客戶端的用戶接口和服務器端的ORM與業務邏輯使用。

在客戶端,它能夠將信息從一個視圖傳輸到另外一個視圖。在服務器端,一些記錄的字段值能夠經過上下文被本地設置提供。

domain表達式:域被用來篩選數據記錄。它們使用特殊的語法,以便於Odoo ORM 將它們解析後生成對應的SQL WHERE數據庫篩選語句。

域表達式是一個條件列表,每一個條件是一個形如('field_name', 'operator', value')的元組。

複製代碼
複製代碼
filed_name 是須要篩選的字段,它可使用點(.)來訪問關係模塊的字段。
value 是一個Python表達式的值。它可使用字符值,好比:字符串,數字,布爾值,或則列表、某個字段、用戶在context中自定義的有效的值。
operator 能夠爲:
    經常使用的操做符:<,>,<=,>=,=,!=。
    '=like'通配符,使用下劃線(_)時,匹配一個任意字符,使用百分號(%)時,匹配多個字符。
    'like'匹配一個’%value%’的字符串。’ilike’與此相似但不區分大小寫。‘not like’和‘not ilike’也可使用
    'child of'在層級關係中,篩選子集
    'in'和’not in’篩選是否在一個列表裏面,因此,給的值應該是個list。當在’to-many’的關係字段中,‘in’的做用和contains的做用同樣
複製代碼
複製代碼

domain表達式是一個包含多項內容的list,所以,能夠包含多個條件表達式元組。 默認狀況下(隱含),這些條件之間是用AND邏輯符鏈接的,也就是說,它只返回知足全部條件的記錄集。

也能夠用顯式的邏輯鏈接符:and鏈接符(&,默認使用),或鏈接符(|)。這些鏈接符後面跟着兩項內容,能夠畫成遞歸樹的形式理解。

感嘆號(!),是非操做符(NOT),做用於緊挨它的後一個項。所以,它應該出如今否認項的前面。好比,['!', ('is_done','=',True)]

['|', ('message_follower_ids', 'in', [user.partner_id.id]),
      '|', ('user_id', '=', user.id), ('user_id', '=', False)]

畫成遞歸樹:

 

 

 

窗體視圖:form視圖

Header頭部:header區域通常用於展現文檔流轉的階段和生命週期,以及動做按鈕。

文檔生命週期經過狀態欄小控件呈現當前所處的狀態.這些一般是狀態選擇字段或者多對一的階段字段。

狀態是一個選擇列表,呈現的是過程當中有幾個至關穩定的步驟階段,例如:新建、處理中、完成。

操做按鈕通常爲表單按鈕,最重要的階段可使用class=「oe_highlight」突出顯示。

Sheet區域:

標題:在group以外,咱們可使用html基本元素來制定標題,如:div,span,H1,和H2等。

分組:<newline>將強制生成一個新行。附加部分標題可使用<separator>元素添加到組內。使用col和colspan屬性,咱們能夠更好的控制組元素佈局。col屬性能夠指定組中包含的列數,默認值是2,它也能夠改成任何數字,雙數的效果更好,由於每個字段加起來都要兩列。組內元素,包括<field>元素,可使用colspan屬性設置一個特定的列數,默認都是一列。

分頁筆記本:筆記本元素能夠包含多個標籤的部分,稱爲頁面。能夠實現按頁切換輸入、顯示。

複製代碼
複製代碼
<notebook>
<page string="顯示文字" name="頁名">
  內容...
</page> 
<page> 
 ...
</page>
</notebook>
複製代碼
複製代碼

 

語義組件:

視圖標籤屬性:

name:標識字段數據庫名稱

string:標籤文本,若是咱們想要覆蓋模型定義提供的標籤文本,可使用它。

help:提示文本,當您將指針懸停在字段上時,將顯示一個提示文本,並容許覆蓋模型定義提供的幫助文本。

placeholder:是一個建議文本,顯示在該字段內。

widget:容許咱們覆蓋用於該字段的缺省小部件。

options:是一個JSON數據結構,爲小部件提供了額外的選項,而且取決於每一個小部件支持什麼。

class:是用於字段HTML呈現的CSS類。

nolabel="True":防止自動字段標籤被呈現。僅對<group>元素中的字段有意義,而且常常和<label for="..."> 元素一塊兒使用.

invisible="True":使字段不可見,可是數據是從服務器獲取的,而且在表單上可用。

readonly="True": 使表單上的字段不可編輯。

required="True" 在表單上字段爲必需字段。

某些字段類型的特殊屬性:

password="True":用於文本字段。它顯示爲一個密碼字段,屏蔽輸入的字符。

filename: 用於二進制字段,它是用於存儲上傳文件名稱的模型字段名稱。

mode:用於一對多字段。它指定用於顯示記錄的視圖類型。默認狀況下,它是樹,但也能夠是表單、看板或圖形。

 

小部件(widget屬性值):

對於文本字段,咱們有如下小部件:

email:是用來將電子郵件文本轉換爲一個可操做的「郵件」地址。

url :用於將文本格式化爲可單擊的url。

html:用於渲染文本做爲html內容;在編輯模式下,以WYSIWYG編輯器,容許內容的格式,而不須要使用HTML語法。

對於數值字段,咱們有如下小部件:

handle:是專門爲列表視圖中的序列字段設計的,並顯示一個句柄,容許您將行拖到一個定製的順序。

float_time:擁有小時和分鐘的時間浮點字段格式.

monetary:做爲貨幣金額顯示浮動字段。它須要一個currency_id夥伴字段,另外一個字段名稱能夠設置選項=「{ 'currency_field ':' currency_id「}」。

progressbar 用一個浮點數表示爲一個進度百分比,而且能夠用於表示完成率字段.

對於關係和選擇字段,咱們有這些附加的小部件:

many2many_tags : 顯示按鈕標籤列表值.

selection:用於多對一字段的選擇字段部件。

radio 使用單選按鈕顯示選擇字段選項.

kanban_state_selection展現了看板狀態選擇列表的信號燈。通常狀態爲灰色,已經完成爲綠色,其餘狀態爲紅色.

priority 一個可點擊的星星列表的選擇字段。可選項通常爲數字.

 

按鈕(button元素)屬性:

icon  可用的按鈕圖標在 addons/web/static/src/img/下

string 按鈕的顯示文字

type 是動做執行類型。可能值是:workflow, object,action   默認是 workflow:

    workflow 用於觸發工做流引擎信號;

    object 用於調用Python方法;

    action 用於運行窗口動做。

name 觸發的方法標識:工做流信號名、模型方法名稱或運行窗口操做的數據庫ID。

args 傳遞方法的參數

context 將值添加到上下文

confirm 針對對話框的確認

special="cancel" 用於嚮導,用來取消和關閉嚮導表單。

class 加載的類名(經常使用 oe_highlight)

 

動態視圖:

視圖元素也支持一些動態屬性,容許動態視圖根據字段值來改變他們的外觀或行爲。

 

其餘視圖:

日曆視圖:

<field name="arch" type="xml">

<calendar date_start="字段" color="顏色"

display="[name], Stage [stage_id]" >

日曆視圖屬性:

date_start開始日期的字段,必需字段。

date_end結束日期的字段,可選字段。

date_delay持續天數的字段,可使用代替date_end。

all_day提供一個布爾字段是用來發送全天事件信號。

color 日曆條目顏色分組的字段 。這個字段中的每一個不一樣的值將被分配一個顏色,而且該字段全部同值的條目將具備相同的顏色。

display 是每一個日程表條目的顯示文本. 它使用方括號加字段名稱表示用戶記錄值,例如[name]。

mode 是日曆的默認顯示模式,不管是一天、一週仍是一個月。

 

圖形視圖:

<graph type="bar">

...

</graph>

圖形視圖元素能夠有一個類型屬性,能夠設置爲條形(默認)、餅狀或線。在條形的狀況下,可使用stacked="True"呈現堆疊在一塊兒的條形圖。

 

樞軸視圖:

<pivot>

....

</pivot>
相關文章
相關標籤/搜索