odoo 開發入門教程系列-QWeb簡史

来源:https://www.cnblogs.com/shouke/archive/2023/04/21/17253437.html
-Advertisement-
Play Games

QWeb簡史 到目前為止,我們的房地產模塊的界面設計相當有限。構建列表視圖很簡單,因為只需要欄位列表。表單視圖也是如此:儘管使用了一些標記,如<group>或<page>,但在設計方面幾乎沒有什麼可做的。 然而,如果我們想給我們的應用程式一個獨特的外觀,就必須更進一步,能夠設計新的視圖。此外,PDF ...


QWeb簡史

到目前為止,我們的房地產模塊的界面設計相當有限。構建列表視圖很簡單,因為只需要欄位列表。表單視圖也是如此:儘管使用了一些標記,如<group><page>,但在設計方面幾乎沒有什麼可做的。

然而,如果我們想給我們的應用程式一個獨特的外觀,就必須更進一步,能夠設計新的視圖。此外,PDF報告或網站頁面等其他功能需要另一個更靈活的工具:模板引擎。

您可能已經熟悉現有的引擎,如Jinja(Python)、ERB(Ruby) 或Twig(PHP)。Odoo自帶內置引擎:QWeb模板。QWeb是Odoo使用的主要模板引擎。它是一個XML模板引擎,主要用於生成HTML片段和頁面。

你可能已經在Odoo見過 看板,其中的記錄以卡片狀結構顯示。我們將為我們的房地產模塊構建這樣的視圖。

一個具體的示例: 一個看板視圖

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

目標: 本節結束時創建一個房產的看板視圖

在我們的地產應用程式中,我們希望添加一個看板視圖來顯示我們的房產。看板視圖是標準的Odoo視圖(如表單和列表視圖),但其結構更靈活。事實上,每張卡片的結構是表單元素(包括基本HTML)和QWeb的混合。看板視圖的定義與列表視圖和表單視圖的定義相似,只是它們的根元素是kanban。看板視圖最簡單的形式如下:

<kanban>
    <templates>
        <t t-name="kanban-box">
            <div class="oe_kanban_global_click">
                <field name="name"/>
            </div>
        </t>
    </templates>
</kanban>

讓我們分解一下這個例子:

  • <templates>:定義QWeb 模板列表。看板視圖必須至少定義一個根模板kanban-box,每個記錄將呈現一次。
  • <t t-name="kanban-box"><t>是QWeb指令的占位符元素。在本例中,它用於將模板的name設置為kanban-box
  • <div class="oe_kanban_global_click">oe_kanban_global_click<div>可點擊,以打開記錄
  • <field name="name"/>:這向視圖中添加name欄位。

練習--製作一個最小的看版視圖

根據上述提供的簡單例子,為房產創建一個最小化的看板視圖。唯一展示的欄位為name.

提示: 必須在ir.actions.act_window對應的view_mode中添加 kanban

修改odoo14\custom\estate\views\estate_property_views.xml(註意:以下未展示文件中的所有內容,其它內容保持不變)

    <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">kanban,tree,form</field><--本次改動新增kanban-->
        <field name="context">{'search_default_state': True}</field>
    </record>
   
    <!-- 本次新增 -->
    <record id="estate_property_kanban" model="ir.ui.view">
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <kanban>
                <templates>
                    <t t-name="kanban-box">
                        <div class="oe_kanban_global_click">
                            <field name="name"/>
                        </div>
                    </t>
                </templates>
            </kanban>
        </field>
    </record>

重啟服務驗證

一旦看板視圖起作用, 我們可以開始改進它。如果我們想有條件的展示元素,可以使用 t-if指令(查看 Conditionals).

<kanban>
    <field name="state"/>
    <templates>
        <t t-name="kanban-box">
            <div class="oe_kanban_global_click">
                <field name="name"/>
            </div>
            <div t-if="record.state.raw_value == 'new'">
                This is new!
            </div>
        </t>
    </templates>
</kanban>

我們添加了幾個東西:

  • t-if: 如果條件為真,渲染<div>元素
  • record: 擁有所有請求欄位作為其屬性的對象。每個欄位都有兩個屬性 valueraw_value。前者是根據當前用戶參數格式化的,後者則是直接通過read()讀取的。

在上面的示例中,欄位name被添加到<templates>元素中,但state在它之外。當我們需要欄位的值但不想在視圖中顯示它時,可以將其添加到<templates>元素之外。

練習--改善看板視圖

添加以下欄位到看板視圖:expected price, best price, selling price 和tags。註意:best price僅在收到報價時展示,而selling price僅在接受報價時展示

修改odoo14\custom\estate\views\estate_property_views.xml estate_property_kanban

    <record id="estate_property_kanban" model="ir.ui.view">
        <field name="model">estate.property</field>
        <field name="arch" type="xml">
            <kanban>
                <field name="state"/>
                <templates>
                    <t t-name="kanban-box">
                        <div class="oe_kanban_global_click">
                            <field name="name"/>
                            <field name="expected_price"/>
                            <!-- <field name="best_price" t-if="record.state.value == 'Offer Received'"/>-->
                            <div t-if="record.state.value == 'Offer Received'">
                                <field name="best_price"/>
                            </div>
                            <div t-if="record.state.value == 'Offer Accepted'">
                                <field name="selling_price" />
                            </div>
                            <field name="tag_ids"/>
                        </div>
                    </t>
                </templates>
            </kanban>
        </field>
    </record>

註意:這裡必須添加<field name="state"/>,否則界面會報類似以下錯誤:

odoo TypeError: Cannot read properties of undefined (reading 'value')

驗證效果

讓我們對視圖做最後的修改:預設情況下,財產必須按類型分組。您可能想看看Kanban中描述的各種選項。

練習--添加預設分組

使用合適的屬性對房產分組,預設按類型分組。你必須阻止拖拽和刪除。

修改odoo14\custom\estate\views\estate_property_views.xml estate_property_kanban,給<kanban>增加屬性

            <kanban default_group_by="state" records_draggable="false">

驗證效果

看板視圖是一個典型的例子,說明從現有視圖開始並對其進行微調而不是從頭開始總是一個好主意。

參考鏈接

https://www.odoo.com/documentation/14.0/zh_CN/developer/howtos/rdtraining.html

https://fontawesome.dashgame.com/

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

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


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

-Advertisement-
Play Games
更多相關文章
  • 可以將Axios攔截器封裝成一個單獨的request文件,以便在整個應用程式中重覆使用。 以下是一個示例,展示如何將Axios攔截器封裝成一個request文件: 1、創建一個名為request.js的新文件,並導入Axios: import axios from 'axios'; 2、創建一個名為 ...
  • 簡介 觀察者模式(Observer Pattern)是一種行為型模式。它定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。 觀察者模式使用三個類Subject、Observer和Client。Subject對象帶有綁定觀察者到Client對象和從 ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記二十七之資料庫函數之文本函數 這篇筆記將介紹如何使用資料庫函數里的文本函數。 顧名思義,文本函數,就是針對文本欄位進行操作的函數,如下是目錄彙總: Concat() —— 合併 Left() —— 從左邊開始截取 Length() —— ...
  • 1 腐蝕操作 用於圖片的去毛刺,內容削減 1 #腐蝕操作 2 #cv2.erode(src,kernel,iterations) 3 #src是圖片數字化數組 4 #kernel則是一個盒,對該盒內的像素進行覆試操作,值越小腐蝕能力越狠 5 #iterations是一個迭代次數,就是說你對這個圖片進 ...
  • 原創:扣釘日記(微信公眾號ID:codelogs),歡迎分享,非公眾號轉載保留此聲明。 簡介 在之前的OOM問題復盤之後,本周,又一Java服務出現了記憶體問題,這次問題不嚴重,只會觸發堆記憶體占用高報警,沒有觸發OOM,但好在之前的復盤中總結了dump腳本,會在堆占用高時自動執行jstack與jmap ...
  • Kaggle上使用Tensorboard 1. 前言 想在Kaggle上使用Tensorboard,找了一圈。 參考了Kaggle上的一個Code:Tensorboard on Kaggle 但發現有些變化,Code中用到的內網穿透工具Ngrok需要加一個Token,所以需要註冊一個Ngrok賬號, ...
  • 註意:Stream和IO流(InputStream/OutputStream)沒有任何關係,請暫時忘記對傳統IO流的固有印象 傳統集合的多步遍歷代碼 幾乎所有的集合(如Collection介面或Map介面等)都支持直接或間接的遍歷操作。而當我們需要對集合中的元素進行操作的時候,除了必需的添加、刪除、 ...
  • boot-admin整合flowable官方editor-app源碼進行BPMN2-0建模(續) 書接上回 項目源碼倉庫github 項目源碼倉庫gitee boot-admin 是一款採用前後端分離模式、基於SpringCloud微服務架構的SaaS後臺管理框架。系統內置基礎管理、許可權管理、運行管 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...