odoo 開發入門教程系列-基本視圖

来源:https://www.cnblogs.com/shouke/archive/2023/03/26/17253327.html
-Advertisement-
Play Games

在上一章中已經看到,odoo能夠為給定模型生成預設視圖。實際上,預設視圖對於業務應用程式來說是不可接受的。相反,我們至少應該以邏輯的方式組織各個欄位。 視圖是在帶有操作和菜單的XML文件中定義的。它們是ir.ui.view model的實例。 在我們的estate模塊中,我們需要以邏輯方式組織欄位: ...


在上一章中已經看到,odoo能夠為給定模型生成預設視圖。實際上,預設視圖對於業務應用程式來說是不可接受的。相反,我們至少應該以邏輯的方式組織各個欄位。

視圖是在帶有操作和菜單的XML文件中定義的。它們是ir.ui.view model的實例。

在我們的estate模塊中,我們需要以邏輯方式組織欄位:

  • 在列表(樹)視圖中,我們希望顯示的不僅僅是名稱。
  • 在表單視圖中,應該對欄位進行分組。
  • 在搜索視圖中,我們必須能夠搜索的不僅僅是名稱。具體來說,我們需要"Available"的地產篩選器和按"postcode"分組的快捷方式

List(列表)

參考: 主題關聯文檔可參考List.

列表視圖,也叫樹(tree)視圖, 以表格的形式顯示記錄。

視圖根元素為<tree>。其最基礎版本僅簡單的列出要在表中顯示的所有欄位(其中每個欄位都是一列):

<tree string="Tests">
    <field name="name"/>
    <field name="last_seen"/>
</tree>

練習 -- 添加一個自定義列表視圖

在合適的XML文件中為estate.property model定義一個列表視圖。 一個簡單的示例

修改odoo14/custom/estate/views/estate_property_views.xml

<?xml version="1.0"?>
<odoo>
    <record id="link_estate_property_action" model="ir.actions.act_window">
        <field name="name">Properties</field>
        <field name="res_model">estate.property</field>
        <field name="view_mode">tree,form</field>
    </record>
    
    <!--本小節添加的內容-->
    <record id="estate_property_view_tree" model="ir.ui.view">
        <field name="name">estate.property.tree</field>
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <tree string="Tests">
                <field name="name" string="Title"/>
                <field name="postcode" string="Postcode"/>
                <field name="bedrooms" string="Bedrooms"/>
                <field name="living_area" string="Living Area"/>
                <field name="expected_price" string="Expected Price"/>
                <field name="selling_price" string="Selling Price"/>
                <field name="date_availability" string="Avalilable Form"/>
            </tree>
        </field>
    </record>
</odoo>

註意:暫時不要添加示例中的 editable="bottom"屬性

說明:

<field name="name">自定義列表名稱</field>
<field name="model">模型名稱,即_name的值</field>

重啟服務,瀏覽器驗證,效果如下:

說明:如果未給<field/>添加string屬性,則顯示如下:

Form(表單)

參考: 主題關聯文檔可以查看Form.

表單用於創建和編輯單條件記錄,其根元素為 <form>,由高層框架元素(groupnotebook)和交互元素 (按鈕和欄位):

<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提供了一些內置類)來微調外觀。

一個簡單示例.

練習 -- 添加自定義表單視圖

在合適的XML文件中為estate.property 定義視圖

為了避免每次修改視圖時都重新啟動伺服器,可以在啟動伺服器時添加--dev-xml,以便只刷新頁面就可以查看視圖修改,如下:

python odoo-bin --addons-path=custom,odoo/addons -r myodoo -w test123 -d odoo -u estate --dev xml

修改odoo14/custom/estate/views/estate_property_views.xml

<?xml version="1.0"?>
<odoo>
    <record id="link_estate_property_action" model="ir.actions.act_window">
        <field name="name">Properties</field>
        <field name="res_model">estate.property</field>
        <field name="view_mode">tree,form</field>
    </record>

    <record id="action_lost_leads" model="ir.actions.act_window">
        <field name="name">Properties</field>
        <field name="res_model">estate.property</field>
        <field name="view_mode">tree,form</field>
    </record>

    <record id="estate_property_view_tree" model="ir.ui.view">
        <field name="name">estate.property.tree</field>
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <tree string="Tests">
                <field name="name" string="Title"/>
                <field name="postcode" string="Postcode"/>
                <field name="bedrooms" string="Bedrooms"/>
                <field name="living_area" string="Living Area"/>
                <field name="expected_price" string="Expected Price"/>
                <field name="selling_price" string="Selling Price"/>
                <field name="date_availability" string="Avalilable Form"/>
            </tree>
        </field>
    </record>
    
    <!--本小節添加的內容-->
    <record id="estate_property_view_form" model="ir.ui.view">
        <field name="name">estate.property.form</field>
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <form string="estate property form">
                <sheet>
                    <h1>
                        <field name="name"/>
                    </h1>
                    <group>
                        <group>
                            <field name="postcode" string="Postcode" ></field>
                            <field name="date_availability" string="Available From"></field>
                        </group>
                        <group>
                            <field name="expected_price" string="Expected Price"></field>
                            <field name="selling_price" string="Selling Price"></field>
                        </group>
                    </group>
                    <notebook>
                        <page string="Description">
                            <group>
                                <field name="description"></field>
                                <field name="bedrooms"></field>
                                <field name="living_area"></field>
                                <field name="facades"></field>
                                <field name="garage"></field>
                                <field name="garden"></field>
                                <field name="garden_area"></field>
                                <field name="garden_orientation"></field>
                            </group>
                        </page>
                    </notebook>
                </sheet>
            </form>
        </field>
    </record>
</odoo>

查看效果

Search(搜索)

參考: 本主題相關文檔可參考Search.

搜索視圖與列表及表單視圖略有不同,因為它們不顯示內容。儘管它們適用於特定模型,但它們用於過濾其他視圖的內容(通常是聚合視圖,比如列表). 除了在使用方面的不同,他們的定義方式是一樣的。

搜索視圖根元素為<search>。該視圖最基礎的版本是列出需要快捷方式的所有欄位:

<search string="Tests">
    <field name="name"/>
    <field name="last_seen"/>
</search>

Odoo生成的預設搜索視圖提供了按name篩選的快捷方式。在自定義搜索視圖中添加用戶可能過濾的欄位是非常常見的。

搜索視圖還可以包含<filter>元素,這些元素充當預定義搜索的開關。篩選器必須具有以下屬性之一:

  • domain:將給定domain添加到當前搜索
  • dontext:添加一些context到當前搜索,使用group_by按給定欄位名稱對結果分組。

一個簡單的示例.

        <record id="view_delivery_carrier_search" model="ir.ui.view">
            <field name="name">delivery.carrier.search</field>
            <field name="model">delivery.carrier</field>
            <field name="arch" type="xml">
                <search string="Delivery Carrier">
                    <field name="name" string="Carrier" />
                    <field name="delivery_type"/>
                    <separator/>
                    <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
                    <group expand="1" string="Group By">
                        <filter string="Provider" name="provider" context="{'group_by':'delivery_type', 'residual_visible':True}"/>
                    </group>
                </search>
            </field>
        </record>

在進一步練習之前,有必要介紹一下domain概念。

domain

引用: 本主題相關文檔可參考 Search domains.

在odoo中,domain對記錄上的條件進行編碼:domain是用於選擇模型記錄子集的條件列表。每個條件都是一個包含欄位名運算符的三元組。如果指定欄位滿足作用於值的運算符的條件,則記錄滿足條件。

例如,當在Product模型上使用時,以下domain選擇單價高於1000的所有services

[('product_type', '=', 'service'), ('unit_price', '>', 1000)]

預設情況下,條件與隱式AND組合在一起,這意味著記錄匹配一個domain,需要滿足domain中的每個條件。邏輯運算符&(AND)、|(OR)和!(NOT)可用於顯式組合條件。它們用於首碼位置(運算符插入在其參數之前,而不是插入在參數之間)。例如,選擇類型為“服務“或“單價”不介於1000和2000之間的產品

['|',
    ('product_type', '=', 'service'),
    '!', '&',
        ('unit_price', '>=', 1000),
        ('unit_price', '<', 2000)]

選擇類型為“服務“且“單價”介於1000和2000之間的產品

['&',('product_type', '=', 'service'),'&',('unit_price', '>=', 1000),('unit_price', '<', 2000)]

等價於

[('product_type', '=', 'service'),('unit_price', '>=', 1000),('unit_price', '<', 2000)]

選擇類型為“服務“或者“單價”大於等於1000或者單價小於500的產品

['|', '|', ('product_type', '=', 'service'),('unit_price', '>=', 1000),('unit_price', '<', 500)]

選擇名字為 ABC 而且語言編碼不為 en_US 而且國家的編碼為 be 或者 de

[('name','=','ABC'),
 ('language.code','!=','en_US'),
 '|',('country_id.code','=','be'),
     ('country_id.code','=','de')]

簡單一點的寫法

[('name','=','ABC'),
 ('language.code','!=','en_US'),
 ('country_id.code','in', ['be', 'de'])]
波蘭表示法簡介

Odoo是使用了波蘭表示法,簡單來說,波蘭表示法是一種操作符置於操作數前,並且不需要括弧仍然能無歧義地解析表達的方法。

運算順序
以二元運算為例,從左至右讀入表達式,遇到一個操作符後跟隨兩個操作數時,則計算之,然後將結果作為操作數替換這個操作符和兩個操作數;重覆此步驟,直至所有操作符處理完畢。

舉個例子:

['|','&','|',a,b,c,'&',d,e]

其中a,b,c,e,f,g 分別是不帶邏輯運算符的表達式,表達式的運算順序:

1、['|','&','|',a,b,c,'&',d,e]
 
2、['|','&',(a | b),c,'&',d,e]
 
3、['|',((a | b) & c),'&',d,e]
 
4、['|',((a | b) & c),(d & e)]
 
5、[(((a | b) | c) | (d & e))]

如果我們要做到這個效果

A and (B or C) and D and E

先從裡面開始,把or提前

A and (or B C) and D and E

把裡面的and提前,去掉括弧

and A or B C and D E

所以最後的domain可以這樣寫

A, '|', B, C, D, E

當然,我們也可以把表達式寫得更容易看一點,如下:

A, D, E, '|', B, C

練習

添加定義搜索視圖

在合適的XML中為 estate.property 模型定義一個搜索視圖

添加過濾和分組

添加以下內容到之前創建就的搜索視圖

  • 一個顯示avaliable地產的過濾器,也就說,state應該為 “New“ 或者“Offer Received”。
  • 按"postcode"分組的能力

修改odoo14/custom/estate/views/estate_property_views.xml

<?xml version="1.0"?>
<odoo>
    <record id="link_estate_property_action" model="ir.actions.act_window">
        <field name="name">Properties</field>
        <field name="res_model">estate.property</field>
        <field name="view_mode">tree,form</field>
    </record>

    <record id="action_lost_leads" model="ir.actions.act_window">
        <field name="name">Properties</field>
        <field name="res_model">estate.property</field>
        <field name="view_mode">tree,form</field>
    </record>

    <record id="estate_property_view_tree" model="ir.ui.view">
        <field name="name">estate.property.tree</field>
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <tree string="Tests">
                <field name="name" string="Title"/>
                <field name="postcode" string="Postcode"/>
                <field name="bedrooms" string="Bedrooms"/>
                <field name="living_area" string="Living Area"/>
                <field name="expected_price" string="Expected Price"/>
                <field name="selling_price" string="Selling Price"/>
                <field name="date_availability" string="Avalilable Form"/>
            </tree>
        </field>
    </record>

    <record id="estate_property_view_form" model="ir.ui.view">
        <field name="name">estate.property.form</field>
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <form string="estate property form">
                <sheet>
                    <h1>
                        <field name="name"/>
                    </h1>
                    <group>
                        <group>
                            <field name="postcode" string="Postcode" ></field>
                            <field name="date_availability" string="Available From"></field>
                        </group>
                        <group>
                            <field name="expected_price" string="Expected Price"></field>
                            <field name="selling_price" string="Selling Price"></field>
                        </group>
                    </group>
                    <notebook>
                        <page string="Description">
                            <group>
                                <field name="description"></field>
                                <field name="bedrooms"></field>
                                <field name="living_area"></field>
                                <field name="facades"></field>
                                <field name="garage"></field>
                                <field name="garden"></field>
                                <field name="garden_area"></field>
                                <field name="garden_orientation"></field>
                            </group>
                        </page>
                    </notebook>
                </sheet>
            </form>
        </field>
    </record>

    <!--本小節添加的內容-->
    <record id="estate_property_search_view" model="ir.ui.view">
        <field name="name">estate.property.search</field>
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <search string="Estate Property">
                <!-- 搜索 -->
                <field name="name" string="Title" />
                <field name="postcode" string="Postcode"></field>
                <separator/>
                <!-- 篩選 -->
                <filter string="Available" name="state" domain="['|',('state', '=', 'New'),('state', '=', 'Offer Received')]"></filter>
                <filter name="bedrooms" domain="[('bedrooms', '>', 3)]"></filter>
                <filter name="bedrooms and selling_price" domain="[('bedrooms', '>', 2),('selling_price', '>=', 1000)]"></filter>
                <!-- 分組 -->
                <group expand="1" string="Group By">
                    <filter string="朝向" name="garden_orientation" context="{'group_by':'garden_orientation'}"/>
                </group>
            </search>
        </field>
    </record>
</odoo>

重啟服務,驗證效果

作者:授客
微信/QQ:1033553122
全國軟體測試QQ交流群:7156436

Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞後如有任何疑問,請聯繫我!!!
           微信打賞                        支付寶打賞                  全國軟體測試交流QQ群  
              


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • UML(Unified Modeling Language)統一建模語言 power designer中給類的“操作”添加“輸入參數” 查看所設計類的代碼: 類和類的六種關係 1 繼承關係(泛化關係) 語義:子類和父類之間的關係 語法:extends 符號:(子類指向父類) power design ...
  • 代理模式(Proxy Pattern)是一種結構型設計模式,結構型模式描述如何將類或對象按某種佈局組成更大的結構。它允許你提供一個代理對象來控制對另一個對象的訪問。代理對象擁有與實際對象相同的介面,因此它可以被用來代替實際對象。 ...
  • 1. JVM線程優化 1.1. 當空間不足時,可以調整線程使用的記憶體 1.2. 每個線程都有一個原生棧,操作系統會在這裡存儲線程的調用棧信息 1.3. 原生棧的大小是1 MB 1.3.1. 32位的Windows JVM原生棧大小是320KB 1.3.2. 在64位的JVM中,通常不會修改這個值 1 ...
  • 1. 下載jsoncpp -->https://github.com/open-source-parsers/jsoncpp/tree/update 兩種下載方法: 方法一:git clone ... 到伺服器上(或虛擬機上...),有點慢,甚至會失敗...! 方法二:下載 zip包,通過第三方軟體 ...
  • 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹在 QT 中使用 VLD 時,有多處記憶體泄漏時的輸出報告解析。 ...
  • 將用戶發來的指令以RESP協議的形式存儲在本地的AOF文件,重啟Redis後執行此文件恢複數據 https://github.com/csgopher/go-redis 本文涉及以下文件: redis.conf:配置文件 aof:實現aof redis.conf appendonly yes app ...
  • 原文鏈接: Go 語言 new 和 make 關鍵字的區別 本篇文章來介紹一道非常常見的面試題,到底有多常見呢?可能很多面試的開場白就是由此開始的。那就是 new 和 make 這兩個內置函數的區別。 其實這個問題本身並不複雜,簡單來說就是,new 只分配記憶體,而 make 只能用於 slice、m ...
  • 南昌航空大學-軟體學院-22206104-段清如-JAVA第一次Blog作業 前言: 這個學期才開始接觸java,到現在一個多月的時間,已經差不多可以寫出一些基本的簡單的程式了。對比上個學期學習的C語言,我認為java更加方便,方法更多,函數更多,但是時間效率上略遜一籌。在這一個月的java學習過程 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...