odoo 開發入門教程系列-一些用戶界面

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

一些用戶界面 數據文件 (XML) 參考: 該主題關聯文檔可以查看Data Files. 上一章,我們通過CSV文件添加了數據。當需要添加數據格式簡單時,用CSV格式還是很方便的,當數據格式更複雜時(比如視圖架構或者一個郵件模板),我們使用XML格式。比如包含HTML tags的 help fiel ...


一些用戶界面

數據文件 (XML)

參考: 該主題關聯文檔可以查看Data Files.

上一章,我們通過CSV文件添加了數據。當需要添加數據格式簡單時,用CSV格式還是很方便的,當數據格式更複雜時(比如視圖架構或者一個郵件模板),我們使用XML格式。比如包含HTML tags的 help field。雖然可以通過CSV文件載入這樣的數據,但是使用XML更方便。

類似CSV文件,XML文件也必須按約定添加到合適的目錄,併在 __manifest__.py中進行定義。數據文件中的內容也是在模塊安裝或者更新時按序載入。因此,對CSV文件所做的所有說明對XML文件都適用。當數據鏈接到視圖時,我們將它們添加到views文件夾中

本章,我們將通過XML文件載入我們第一個action和菜單。Actions 和菜單為資料庫中的標準記錄。

註解:

當程式很註重性能時,CSV格式優先於XML格式。這是因為,在odoo中載入CSV文件比載入XML文件更快。

odoo中,用戶介面(action,菜單和視圖)大部分是通過創建和組裝XML文件中的記錄來定義的。常見的模式為 菜單> action > 視圖。為了訪問記錄,用戶在幾個菜單級中導航。最深層是觸發打開記錄列表的action。

操作(Actions)

參考: 主題相關文檔可以查看 Actions.

動作可以通過三種方式觸發 :

  1. 點擊菜單項目(鏈接接到指定動作)
  2. 點擊視圖按鈕(如果與action關聯)
  3. 對象的上下文action

本章僅涵蓋第一種情況。 我們Real Estate例子中,希望將一個菜單連接到 estate.property model, 以便創建一個新記錄。 action可以視為菜單和model之間的鏈接

test.model 的基本action:

<record id="test_model_action" model="ir.actions.act_window">
    <field name="name">Test action</field>
    <field name="res_model">test.model</field>
    <field name="view_mode">tree,form</field>
</record>
  • id 外部標識。它可以用於引用記錄(不需要知道其在資料庫中的標識符)。
  • model ir.actions.act_window (Window Actions (ir.actions.act_window))的一個固定值
  • name action名稱
  • res_model action應用的範圍。
  • view_mode 可獲取的視圖。本例中為列表(樹)和表格視圖。

odoo中到處都可以找到例子,但是這個 簡單action的好例子。關註XML 數據文件結構,因為你在後續的練習中會用到。

<?xml version="1.0"?>
<odoo>
    <record id="crm_lost_reason_view_search" model="ir.ui.view">
        <field name="name">crm.lost.reason.view.search</field>
        <field name="model">crm.lost.reason</field>
        <field name="arch" type="xml">
            <search string="Search Opportunities">
                <field name="name"/>
                <filter string="Include archived" name="archived" domain="['|', ('active', '=', True), ('active', '=', False)]"/>
                <separator/>
                <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
            </search>
        </field>
    </record>

    <record id="crm_lost_reason_view_form" model="ir.ui.view">
        <field name="name">crm.lost.reason.form</field>
        <field name="model">crm.lost.reason</field>
        <field name="arch" type="xml">
            <form string="Lost Reason">
                <sheet>
                    <div class="oe_button_box" name="button_box">
                        <button name="action_lost_leads" type="object"
                            class="oe_stat_button" icon="fa-star">
                            <div class="o_stat_info">
                                <field name="leads_count" class="o_stat_value"/>
                                <span class="o_stat_text"> Leads</span>
                            </div>
                        </button>
                    </div>
                    <widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
                    <div class="oe_title">
                        <div class="oe_edit_only">
                            <label for="name"/>
                        </div>
                        <h1 class="mb32">
                            <field name="name" class="mb16"/>
                        </h1>
                        <field name="active" invisible="1"/>
                    </div>
                </sheet>
            </form>
        </field>
    </record>

    <record id="crm_lost_reason_view_tree" model="ir.ui.view">
        <field name="name">crm.lost.reason.tree</field>
        <field name="model">crm.lost.reason</field>
        <field name="arch" type="xml">
            <tree string="Channel" editable="bottom">
                <field name="name"/>
            </tree>
        </field>
    </record>

    <!-- Configuration/Lead & Opportunities/Lost Reasons Menu -->
    <record id="crm_lost_reason_action" model="ir.actions.act_window">
        <field name="name">Lost Reasons</field>
        <field name="res_model">crm.lost.reason</field>
        <field name="view_mode">tree,form</field>
        <field name="help" type="html">
          <p class="o_view_nocontent_smiling_face">
            Define a new lost reason
          </p><p>
            Use lost reasons to explain why an opportunity is lost.
          </p><p>
            Some examples of lost reasons: "We don't have people/skill", "Price too high"
          </p>
        </field>
    </record>

    <record id="menu_crm_lost_reason" model="ir.ui.menu">
        <field name="action" ref="crm.crm_lost_reason_action"/>
    </record>
</odoo>

練習

estate.property model 創建action。

在適當的位置(本例中為odoo14/custom/estate/models/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>
</odoo>

修改odoo14/custom/estate/__manifest__.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
{
    'name': 'estate',
    'depends': ['base'],
    'data':['security/ir.model.access.csv',
            'views/estate_property_views.xml'
            ]
}

重啟服務並觀察文件載入日誌。

菜單(Menus)

參考: 和本主題關聯文檔可以查看Shortcuts.

為了減少菜單(ir.ui.menu)定義和鏈接到對應action的複雜性,我們可以使用 shortcut

test_model_action 一個的基礎菜單:

<menuitem id="test_model_menu_action" action="test_model_action"/>

test_model_menu_action 菜單被鏈接到 test_model_actionaction鏈接到model test.model。正如前面所述, action可以看做是菜單和model之間的連接。

註意:這裡的id的值和action的值不能設置成一樣,否則會報錯。

然而,菜單總是遵循一種體繫結構,實際上有三個層次的菜單:

  1. 根菜單,顯示在App切換器中(Odoo社區版切換器是一個下拉菜單)
  2. 第一級菜單,顯示在頂部欄中
  3. 動作菜單

最容易的方式是在XML文件中定義結構來創建菜單。

test_model_action 定義的一個基礎菜單結構:

<menuitem id="test_menu_root" name="Test">
    <menuitem id="test_first_level_menu" name="First Level">
        <menuitem id="test_model_menu_action" action="test_model_action"/>
    </menuitem>
</menuitem>

第三級菜單的名稱,直接從action獲取,即為action屬性值

練習

添加菜單

在合適的目錄(本例中為odoo14/custom/estate/models/views)創建 estate_menus.xml 文件

<?xml version="1.0"?>
<odoo>
    <menuitem id="test_menu_root" name="Test">
        <menuitem id="test_first_level_menu" name="First Level">
            <menuitem id="estate_property_menu_action" action="link_estate_property_action"/>
        </menuitem>
    </menuitem>
</odoo>

修改odoo14/custom/estate/__manifest__.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
{
    'name': 'estate',
    'depends': ['base'],
    'data':['security/ir.model.access.csv',
            'views/estate_property_views.xml',
            'views/estate_menus.xml'
            ]
}

重啟odoo服務,查看效果

欄位,屬性和視圖(Fields, Attributes And View)

到目前為止,我們只對房產廣告使用了通用視圖,但在大多數情況下,我們希望對視圖進行微調。Odoo有許多微調方式,但通常第一步是確保:

  • 某些欄位有預設值
  • 某些欄位只讀
  • 當記錄重覆時,某些欄位不能被拷貝

在我們的房產業務案例中,我們希望::

  • 售價只讀(往後將自動填充)
  • 當記錄重覆時,可用日期和售價不能被拷貝
  • 卧室數量應該預設為2
  • 預設可用日期應該為3個月

一些新屬性

在進一步進行視圖設計之前,讓我們回到模型定義。我們看到一些屬性,如required=True,會影響資料庫中的表模式。其他屬性也將影響視圖或提供預設值。

練習 -- 添加一些屬性到欄位。

查找一些合適的屬性 (查看欄位) 來:

  • 設置售價為只讀
  • 阻止複製可用日期和售價

修改 odoo14\custom\estate\models\estate_property.pyEstateProperty類屬性expected_priceselling_price的值如下:

expected_price = fields.Float('expected price', digits=(8, 2),  required=True) 
selling_price = fields.Float('selling price', digits=(8, 2), readonly=True, copy=False)

重啟服務和並刷新瀏覽器界面,我們可以看到無法設置任何售價。複製記錄時,可用日期應為空。

預期效果可參考該動畫連接:https://www.odoo.com/documentation/14.0/zh_CN/_images/attribute_and_default.gif

預設值

可以為任何欄位設置預設值。欄位定義中,添加 default=X, 其中的X 可以是Python文本值(boolean, integer, float, string) ,也可以是一個以model對象自身為入參並返回一個值的函數:

name = fields.Char(default="Unknown")
last_seen = fields.Datetime("Last Seen", default=lambda self: fields.Datetime.now())

例中name欄位預設值為‘Unknown’,而last_seen 欄位預設值為當前時間

練習 -- 設置預設值

添加適當的預設值:

  • 卧室數量預設值為 2
  • 可用日期預設為3個月內

修改 odoo14\custom\estate\models\estate_property.pyEstateProperty類屬性bedroomsselling_price的值如下:

bedrooms = fields.Integer(default=2)
date_availability = fields.Datetime('Availability Date', copy=False, default= lambda self: fields.Datetime.today())

重啟服務和並刷新瀏覽器界面驗證

保留欄位

參考: 主題相關文檔可參考 保留欄位名稱.

odoo為預定義行為保留了一些欄位名稱。當需要相關行為時,需要在模型中定義這些保留欄位。

練習 -- 添加active欄位

添加一個 active 欄位到estate.property 模型。

修改 odoo14\custom\estate\models\estate_property.pyEstateProperty類,增加active屬性

active = fields.Boolean('Active')

重啟服務,刷新瀏覽器界面,新增一條記錄,新增時勾選Active覆選框,即active=True,驗證效果。

預期效果可參考該動畫鏈接:https://www.odoo.com/documentation/14.0/zh_CN/_images/inactive.gif

註意,已存在的記錄的active欄位預設值為False

練習--為active欄位添加設置

active欄位設置預設值

active 欄位設置適當的屬性值,讓它不再出現在頁面。

練習 -- 添加state欄位

estate.property model添加state 欄位(欄位名可自定義),一個選擇列表。可選值: New, Offer Received, Offer Accepted, SoldCanceled。必選欄位,且不能被拷貝,預設值New

修改 odoo14\custom\estate\models\estate_property.pyEstateProperty類,修改active欄位,增加state欄位

    active = fields.Boolean('Active', default=True, invisible=True) # 註意:實踐發現,invisible欄位不起作用
    state = fields.Selection(
        string='State',
        selection=[('New','New'),
                   ('Offer Received','Offer Received'),
                   ('Offer Accepted', 'Offer Accepted'),
                   ('Sold','Sold'),
                   ('Canceled', 'Canceled')],
        copy=False
    )

重啟服務,驗證效果

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

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


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

-Advertisement-
Play Games
更多相關文章
  • Java已經誕生20多年了,依然是企業級開發中使用最廣泛的語言,也是挨罵最多的語言。Java廣受批評的四個缺點是:性能差、記憶體消耗大、GUI弱、代碼啰嗦,我們應該如何看待這幾個問題呢?在微服務的背景下,提倡圍繞業務能力而非技術來構建應用,允許由不同的語言構建應用程式。一個超大的集群,往往有上萬個微服... ...
  • 什麼是Servlet? Servlet是使用Java語言編寫的運行在伺服器端的程式。狹義的Servlet是指Java語言實現的一個介面,廣義的Servlet是指任何實現了這個Servlet介面的類,一般情況下,人們將Servlet理解為後者。Servlet 主要用於處理客戶端傳來的 HTTP 請求, ...
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址 Spring的優點 通過控制反轉 ...
  • 電腦編程說到底還是程式員的思維體現,人情世故也會反映在代碼的邏輯上, 寫代碼就如學做人一樣,從哪裡來到哪裡去 ...
  • SpringBoot整合MyBatis/Plus 1.SpringBoot整合MyBatis 1.1整合案例 需求:整合SpringBoot和Mybatis,向資料庫中查詢數據。 項目結構: 1.1.1創建資料庫和表 -- 創建資料庫 DROP DATABASE IF EXISTS springbo ...
  • 概述 JWT,Java Web Token,通過 JSON 形式作為 Web 應用中的令牌,用於在各方之間安全地將信息作為 JSON 對象傳輸,在數據傳輸過程中還可以完成數據加密、簽名等相關處理 JWT 的作用如下: 授權:一旦用戶登錄,每個後續請求將包括 JWT,從而允許用戶訪問該令牌允許的路由, ...
  • 題目:數組反轉 要求: 把數組的內容反轉。 如:arr{ 11 , 22 , 33 , 44 , 55 , 66 } --> { 66 , 55 , 44 , 33 , 22 , 11 }。 思路-1 通過具體實例得,每一次都是將 arr[i] 和 arr[arr.length - 1 -i] 交換 ...
  • 原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此聲明。 問題發生 上上周,看到一位老哥找我們組同事聯調介面,不知道是什麼問題,兩人坐一起搞了快1個小時,看起來好像有點複雜。 突然,老哥發出一聲卧槽,"我傳參里的+號,到你這怎麼變成了空格!",這個聲音很大,我明顯的聽到 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...