odoo 开发入门教程系列-QWeb简史
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: 拥有所有请求字段作为其属性的对象。每个字段都有两个属性value和raw_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/
odoo 开发入门教程系列-QWeb简史的更多相关文章
- WPF入门教程系列(一) 创建你的第一个WPF项目
WPF入门教程系列(一) 创建你的第一个WPF项目 WPF基础知识 快速学习绝不是从零学起的,良好的基础是快速入手的关键,下面先为大家摞列以下自己总结的学习WPF的几点基础知识: 1) C#基础语法知 ...
- Android Studio JNI开发入门教程
Android Studio JNI开发入门教程 2016-08-29 14:38 3269人阅读 评论(0) 收藏 举报 分类: JNI(3) 目录(?)[+] 概述 在Andorid ...
- SeaJS入门教程系列之使用SeaJS(二)
SeaJS入门教程系列之使用SeaJS(二) 作者: 字体:[增加 减小] 类型:转载 时间:2014-03-03我要评论 这篇文章主要介绍了SeaJS入门教程系列之使用SeaJS,着重介绍了SeaJ ...
- 移动H5开发入门教程:12点webAPP前端开发经验
如果你是一名移动H5前端开发人员,25学堂的小编认为下面的分享的12点webAPP前端开发经验是你必须掌握的基础知识点.算是一篇移动H5开发入门教程吧! 1. viewport:也就是可视区域.对于桌 ...
- Silverlight,Windows 8应用开发实例教程系列汇总
Kevin Fan分享开发经验,记录开发点滴 Silverlight,Windows 8应用开发实例教程系列汇总 2012-06-18 01:05 by jv9, 2145 阅读, 3 评论, 收藏, ...
- ActiveMQ详细入门教程系列(一)
一.什么是消息中间件 两个系统或两个客户端之间进行消息传送,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环境下 ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- WPF入门教程系列三——Application介绍(续)
接上文WPF入门教程系列二——Application介绍,我们继续来学习Application 三.WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时,应用程序 ...
- WPF入门教程系列二——Application介绍
一.Application介绍 WPF和WinForm 很相似, WPF与WinForm一样有一个 Application对象来进行一些全局的行为和操作,并且每个 Domain (应用程序域)中仅且只 ...
- 基于Nodejs生态圈的TypeScript+React开发入门教程
基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...
随机推荐
- logrotate 切割Tomcat的catalina.out文件
使用logrotate进行切割. 在/etc/logrotate.d下,新建tomcatrotate,编辑tomatrotate,写入如下内容: /usr/local/tomcat/logs ...
- 《Unix/Linux系统编程》第十周学习笔记
<Unix/Linux系统编程>第十周学习笔记 块设备I/O和缓冲区管理 解释块设备I/O的原理和I/O缓冲的优点 I/O缓冲区:内核中的一系列NBUF缓冲区用作缓冲区缓存.每个缓冲区用一 ...
- ps18.3.20
PS添加图层蒙版,然后画笔,括号是画笔的大小,,还要调,不透明度
- Python第五章实验报告
一.实验项目名称:<零基础学Python>第五章实战.实例以及两道作业题 二.实验目的和要求:了解和掌握操作字符串的方法和正则表达式的应用 三.实验环境:IDLE(Python 3.9 6 ...
- python-GUI-tkinter之excel密码破解工具
python gui 之熟悉tkinter部分控件使用.一个简单的excel暴力密码破解,核心很简单,基本就是一个函数外面加了GUI,写的很啰嗦,希望大家可以在优化改良下,主要是为了再熟悉下tkint ...
- win 11 VMware workstations b不可恢复的错误(vcpu-2)
首先检查一下电脑有没有开启CPU虚拟化,我的已经开启了,按照百度的方法去控制面板卸载程序里面,找到VMware 右击更改 弹出的安装程序点修复,,结果修复出错了,显示写入文件D:\vm\glib-2. ...
- 把OSC_IN/OSC_OUT引脚作为GPIO端口PD0/PD1
外部振荡器引脚OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现.这个重映射只适用于36. 48和64脚的封装(100脚和 ...
- c++ 内存顺序
搞懂无锁编程的重要一步是完全理解内存顺序! 本教程由作者和ChatGPT通力合作完成. 都有哪几种? c++的内存模型共有6种 memory_order_relaxed memory_order_co ...
- Android笔记--Android+数据库的增加数据的实现
具体实现 添加成功: 界面代码很简单,直接忽略. 连接数据库的代码: Connect.java package com.example.myapplication.database; import a ...
- 四种OS网络属性配置
1.Windows BAT设置网络属性: netsh interface ip set address "Ethernet" static 192.168.31.223 255.2 ...
