odoo 开发入门教程系列-QWeb简史

QWeb简史

到目前为止,我们的房地产模块的界面设计相当有限。构建列表视图很简单,因为只需要字段列表。表单视图也是如此:尽管使用了一些标记,如<group><page>,但在设计方面几乎没有什么可做的。

然而,如果我们想给我们的应用程序一个独特的外观,就必须更进一步,能够设计新的视图。此外,PDF报告或网站页面等其他功能需要另一个更灵活的工具:模板引擎。

您可能已经熟悉现有的引擎,如Jinja(Python)、ERB(Ruby) 或Twig(PHP)。Odoo自带内置引擎:QWeb模板。QWeb是Odoo使用的主要模板引擎。它是一个XML模板引擎,主要用于生成HTML片段和页面。

你可能已经在Odoo见过 看板,其中的记录以卡片状结构显示。我们将为我们的房地产模块构建这样的视图。

一个具体的示例: 一个看板视图

参考: 本主题关联文档可以查看Kanban.

目标: 本节结束时创建一个房产的看板视图

odoo 开发入门教程系列-QWeb简史

在我们的地产应用程序中,我们希望添加一个看板视图来显示我们的房产。看板视图是标准的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>

重启服务验证

odoo 开发入门教程系列-QWeb简史

一旦看板视图起作用, 我们可以开始改进它。如果我们想有条件的展示元素,可以使用 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')

验证效果

odoo 开发入门教程系列-QWeb简史

让我们对视图做最后的修改:默认情况下,财产必须按类型分组。您可能想看看Kanban中描述的各种选项。

练习--添加默认分组

使用合适的属性对房产分组,默认按类型分组。你必须阻止拖拽和删除。

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

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

验证效果

odoo 开发入门教程系列-QWeb简史

看板视图是一个典型的例子,说明从现有视图开始并对其进行微调而不是从头开始总是一个好主意。

参考链接

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

https://fontawesome.dashgame.com/

原文链接:https://www.cnblogs.com/shouke/p/17253437.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:odoo 开发入门教程系列-QWeb简史 - Python技术站

(0)
上一篇 2023年4月22日
下一篇 2023年4月22日

相关文章

  • Python实现自动清理电脑垃圾文件详解

    下面是一份实现自动清理电脑垃圾文件的Python脚本的完整例子。该脚本可以自动清理指定目录下的垃圾文件,例如临时文件、回收站文件等等。本文将针对该例子进行详细的讲解。 1. 问题概述 在我们经过一段时间的电脑操作后,通常都会留下不少的垃圾文件,如缓存文件、临时文件、回收站文件等等。这些文件不仅占用了硬盘空间,而且会影响电脑的运行速度。通常情况下,我们需要手动…

    python 2023年5月13日
    00
  • Python中使用socket发送HTTP请求数据接收不完整问题解决方法

    一、问题背景 在Python中使用socket发送HTTP请求时,因为HTTP协议是基于TCP协议的,其中包含的数据长度可能会非常长,因此数据不一定会一次性接收完毕,导致在接收数据时,可能出现接收不完整的情况。这时候就需要采用一些方法来解决这个问题。 二、问题解决方法 循环接收数据 我们可以循环接收数据,直到接收完整个响应,可以使用一个while循环来完成,…

    python 2023年6月3日
    00
  • python实现的Iou与Giou代码

    让我给您详细讲解一下如何实现Python的IoU与GIoU代码。 1. IoU 1.1 什么是IoU? IoU即Intersection over Union,也就是交并比。它是衡量两个边界框之间重叠程度的一种方法。IoU可用于计算检测模型的准确度。 1.2 IoU的计算方法 IoU的计算方法如下: IoU = Intersection(A,B) / Uni…

    python 2023年5月19日
    00
  • Python爬虫技术

    Python爬虫技术 Python爬虫技术是通过编写程序,自动从互联网上爬取数据并进行处理分析的技术。Python作为一种功能强大、语法简洁、易于学习的编程语言,被广泛应用于爬虫领域。 爬虫的基本流程 1. 确定爬取的目标和方式 在开始爬虫的过程中,首先需要明确爬虫的目标和方式。需要明确爬取的数据类型、要爬取的网站、爬虫的频次等等。 2. 构造URL和请求 …

    python 2023年5月14日
    00
  • 学python需要去培训机构吗

    学习Python不一定需要去培训机构,但是如果你是完全没有编程经验的初学者,或者想要迅速掌握Python编程技能,那么参加培训机构的课程可能会更有帮助。 以下是学习Python的完整攻略: 1. 了解基础知识 在学习任何一门编程语言之前,了解一些计算机科学的基础知识是非常重要的。比如,计算机是如何处理数据,计算机操作系统是什么,程序是如何运行的等。建议初学者…

    python 2023年5月13日
    00
  • Python中replace方法实例分析

    以下是“Python中replace方法实例分析”的完整攻略: 一、问题描述 在Python中,字符串是一种常见的数据类型。字符串对象有一个replace()方法,可以用于替换字符串中的子串。本文将详细讲解Python中replace()方法的用法和示例。 二、解决方案 2.1 replace()方法的语法 replace()方法的语法如下: str.rep…

    python 2023年5月14日
    00
  • python文档字符串(函数使用说明)使用详解

    下面是详细的攻略: Python文档字符串(函数使用说明)使用详解 在Python中,文档字符串(docstring)是一种特殊的注释,用于描述函数、类、模块等的使用说明。文档字符串通常放在函数、类、模块的开头,用三个双引号或三个单引号括起来。本文将介绍Python文档字符串的使用方法,并提供两个示例说明。 Python文档字符串的格式 Python文档字符…

    python 2023年5月14日
    00
  • Django中数据在前后端传递的方式之表单、JSON与ajax

    Django是一款使用Python语言开发的极具人气的Web框架,它提供了一系列的数据在前后端之间传递的方式,常用的方式包括表单、JSON与ajax。本文将为大家详细讲解这三种方式的用法和区别。 表单 表单是Web开发中最常用的数据收集和传递方式之一,它能够将用户输入的数据收集,并传递给后端。在Django中,我们可以通过HTML表单实现数据在前后端的传递。…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部