第七章:基本視圖?
我們在 上一章節 中已經看到,Odoo 能夠為給定的模型生成默認視圖。實際上,對于商業應用程序來說,缺省視圖 永遠不是 可接受的。相反,我們至少應該以一種邏輯方式組織各個字段。
視圖在 XML 文件中定義,包含操作和菜單。它們是 ir.ui.view
模型的實例。
在我們的房地產模塊中,我們需要以邏輯方式組織字段:
在列表(樹形)視圖中,我們希望顯示更多內容,而不僅僅是名稱。
在表單視圖中,字段應該被分組。
在搜索視圖中,我們必須能夠搜索更多的內容,而不僅僅是名稱。具體來說,我們想要一個“可用”屬性的過濾器和一個按郵政編碼分組的快捷方式。
列表?
參考 : 有關此主題的文檔可以在 列表 中找到。
注解
目標 :本節結束時,列表視圖應如下所示:

列表視圖,也稱為樹形視圖,以表格形式顯示記錄。
它們的根元素是 <tree>
。這個視圖的最基本版本只是簡單地列出要在表格中顯示的所有字段(每個字段都是一列):
<tree string="Tests">
<field name="name"/>
<field name="last_seen"/>
</tree>
一個簡單的例子可以在 這里 找到。
Exercise
添加自定義列表視圖。
在適當的 XML 文件中為 estate.property
模型定義一個列表視圖。查看本節的 **目標 ** 以獲取要顯示的字段。
小費:
不要添加
editable="bottom"
屬性,你可以在上面的例子中找到。我們稍后會回到它。一些字段標簽可能需要調整以匹配參考。
像往常一樣,您需要重新啟動服務器(不要忘記 -u
選項)并刷新瀏覽器以查看結果。
警告
在本章中,您可能會使用一些復制粘貼操作,因此請確保每個視圖的“id”保持唯一!
表單?
參考 : 有關此主題的文檔可以在 表單 中找到。
注解
目標 :本節結束時,表單視圖應如下所示:

表單用于創建和編輯單個記錄。
它們的根元素是 <form>
。它們由高級結構元素(組和筆記本)和交互元素(按鈕和字段)組成:
<form string="Test">
<sheet>
<group>
<group>
<field name="name"/>
</group>
<group>
<field name="last_seen"/>
</group>
<notebook>
<page string="Description">
<field name="description"/>
</page>
</notebook>
</group>
</sheet>
</form>
您可以使用常規的HTML標簽,例如 div
和 h1
,以及 class
屬性(Odoo提供了一些內置類)來精細調整外觀。
一個簡單的例子可以在 這里 找到。
Exercise
添加自定義表單視圖。
在適當的 XML 文件中為 estate.property
模型定義一個表單視圖。查看本節的 目標 ,了解頁面的預期最終設計。
這可能需要一些試錯才能達到預期的結果;-)建議您逐個添加字段和標簽,以幫助理解其工作原理。
為了避免每次修改視圖時都要重新啟動服務器,可以在啟動服務器時使用 --dev xml
參數,這樣會更方便:
$ ./odoo-bin --addons-path=../custom,../enterprise/,addons -d rd-demo -u estate --dev xml
該參數允許您只需刷新頁面即可查看您的視圖修改。
搜索?
參考 : 有關此主題的文檔可以在 搜索 中找到。
注解
目標 :本節結束后,搜索視圖應該如下所示:



搜索視圖與列表視圖和表單視圖略有不同,因為它們不顯示 內容 。雖然它們適用于特定的模型,但它們用于過濾其他視圖的內容(通常是聚合視圖,如 列表 )。除了用例的不同之外,它們的定義方式相同。
它們的根元素是 <search>
。這個視圖的最基本版本只是列出所有需要快捷方式的字段:
<search string="Tests">
<field name="name"/>
<field name="last_seen"/>
</search>
Odoo生成的默認搜索視圖提供了按“名稱”過濾的快捷方式。通常在自定義搜索視圖中添加用戶可能進行過濾的字段非常常見。
Exercise
添加自定義搜索視圖。
在適當的XML文件中為“estate.property”模型定義搜索視圖。查看本節“目標”的第一張圖片以獲取字段列表。
重啟服務器后,應該可以根據給定的字段進行過濾。
搜索視圖也可以包含 <filter>
元素,它們作為預定義搜索的切換開關。過濾器必須具有以下屬性之一:
domain
: 將給定的域添加到當前搜索中context
: 為當前搜索添加一些上下文;使用鍵group_by
按給定字段名稱對結果進行分組
可以在 這里 找到一個簡單的例子。
在繼續進行本練習之前,有必要介紹“域”概念。
域名?
參考 : 有關此主題的文檔可以在 搜索域 中找到。
在Odoo中,域編碼記錄的條件:域是選擇模型記錄子集的條件列表。每個條件都是一個三元組,包括 字段 運算符 和 值 。如果指定的字段滿足運算符應用于值的條件,則記錄滿足條件。
例如,當在 產品 模型上使用時,以下域選擇所有單價大于 1000 的 服務 :
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
默認情況下,條件使用隱式的AND組合,這意味著 每個 條件都需要滿足才能使記錄匹配域。邏輯運算符 &
(AND), |
(OR)和 !
(NOT)可用于顯式地組合條件。它們在前綴位置使用(運算符插入其參數之前而不是之間)。例如,要選擇產品“是服務 或 具有單位價格 不在 1000和2000之間”的條件:
['|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)]
Exercise
添加篩選和分組。
應該添加以下內容到之前創建的搜索視圖中:
一個過濾器,顯示可用的屬性,即狀態應為“新”或“已收到報價”。
按郵政編碼分組結果的能力。
看起來不錯吧?此時我們已經能夠創建模型并設計出符合業務邏輯的用戶界面。然而,還缺少一個關鍵組件:模型之間的 鏈接 。