在ODOO里面中,通过QWeb来对模板进行渲染后加载到浏览器中,故作笔记以便于查询
简介:
Qweb被用作OpenERP的Web客户端模板引擎。它是一种基于XML的模板语言,同Genshi, Thymeleaf、Facelets模板具有相似并且具有以下特性:

               1、完全在客户端浏览器中完成渲染;

 2、一个模板文件中可以包含多个模板,通常一个模板文件中包含一个模板;

               对OpenERP的web组件有很好的支持,也可以用于除开OpenERP web外的其他框架。

一、基础语法:模板中的标签统一都是以"t-"开始的。


t-name 用于指明模板的名称
案例:
<t t-name="code_backend_theme.Sidebar">
...

</t>


t-extend 用于指明该模板是继承自另外哪一个模板,后面会带父模板的名称,如:t-extend=“Login"
t-jquery 一个jQuery的选择器,后面指明选择器的定义,如:t-jquery=".oe_logiin"
t-operation 一般跟在t-jquery后面,指明选择器找到元素后执行的动作,其值有:append(追加)、replace(替换)、after、inside
案例:
1、
<t t-extend="Menu">
<t t-jquery=".o_main_navbar" t-operation="after">
<div class="sidebar_panel" id="sidebar_panel"/>
</t>
</t>

2、
<t t-jquery="img" t-operation="attributes">
<attribute name="t-att-title">value</attribute>
</t>

3、
<t t-jquery="span:first" t-operation="prepend">
<span t-if="attendeesData[el_index]" t-attf-class="o_calendar_invitation #{attendeesData[el_index].status}"/>
</t>
 

t-if 用于指明元素在页面产生的条件,后面是带一个javascript的表达式,返回True或False
<div t-if="widget._initialState.valuemax">
<div t-if="widget._initialState.valuemax &gt; widget._initialState.defaultDisplayQty">
<button class="btn btn-secondary js_load_more">Load more</button>
</div>
</div>
t-att-### 用于指明一个元素的属性值,###是元素的属性名称,如:t-att-value="javascript表达式"

t-foreach 用于指明一个循环调用,后面一般带的是一个数组
t-as 用于取得循环中的单个值,与t-foreach搭配使用,后面带的是一个变量名,可以循环中使用变量取值
t-esc 用于一个文字输出
<ul class="sidebar_menu">
<t t-foreach="widget.getApps()" t-as="app">
<li>
<a role="menuitem" t-attf-href="#menu_id=#{app.menuID}"
class="nav-link" t-att-data-menu-id="app.menuID"
t-att-data-menu-xmlid="app.xmlID"
t-att-data-action-id="app.actionID">
<img class="sidebar_img"
t-attf-src="data:image/png;base64,#{app.web_icon_data}"/>
<span class="sidebar_app_name">
<t t-esc="app.name"/>
</span>
</a>
</li>
</t>
</ul>

t-call 用于调用另外模板,后面带一个模板的名称
t-set 用于设定一个变量,后面带变量的名称,一般跟t-value搭配使用

t-value 用于指定某个变量或元素的值
 
<div t-name="PdcDocument.files" class="o_attachments" aria-atomic="true">
<!-- uploaded files -->
<t t-foreach="widget.value.data" t-as="file">
<t t-if="!file.data.upload" t-call="PdcDocument.attachment_preview"/>
</t>

<!-- uploading files -->
<t t-foreach="widget.uploadingFiles" t-as="file">
<t t-set="upload" t-value="true"/>
<t t-call="PdcDocument.attachment_preview"/> 调用qweb模板
PdcDocument.attachment_preview
 </t>
</div>

<t t-name="PdcDocument.attachment_preview">
<t t-set="url" t-value="widget.metadata[file.id] ? widget.metadata[file.id].url : false"/>
<t t-if="file.data" t-set="file" t-value="file.data"/>
<t t-set="editable" t-value="widget.mode === 'edit'"/>
<t t-if="file.mimetype" t-set="mimetype" t-value="file.mimetype"/>
<div t-attf-class="o_attachment o_attachment_many2many #{ editable ? 'o_attachment_editable' : '' } #{upload ? 'o_attachment_uploading' : ''}"
t-att-title="file.name">
<div class="o_attachment_wrap">
<t t-set="ext" t-value="file.name.replace(/^.*\./, '')"/>
<div class="o_image_box float-left" t-att-data-id="file.id">
<div t-att-title="'Download ' + file.name" aria-label="Download">
<span class="o_image o_hover" t-att-data-id="FileId" t-att-data-mimetype="mimetype"
t-att-data-ext="ext" role="img"/>
</div>
</div> <div class="caption">
<a class="ml4" t-att-href="url" t-att-title="'Download ' + file.name">
<t t-esc='file.name'/>
</a>
</div>
<div class="caption small">
<div class="ml4 small text-uppercase" t-att-title="'Download ' + file.name">
<b>
<t t-esc='ext'/>
</b>
</div>
<div t-if="editable" class="progress o_attachment_progress_bar">
<div class="progress-bar progress-bar-striped active" style="width: 100%">Uploading</div>
</div>
</div> <div t-if="editable" class="o_attachment_uploaded">
<i class="text-success fa fa-check" role="img" aria-label="Uploaded" title="Uploaded"/>
</div>
<div t-if="editable" class="o_attachment_delete" t-att-data-id="file.id">
<span class="text-white" role="img" aria-label="Delete" title="Delete">×</span>
</div>
</div>
</div>
</t>


var AbstractField = require("web.AbstractField");
var field_registry = require("web.field_registry");
var core = require('web.core'); var qweb = core.qweb;
var Upload_skim_pdf = AbstractField.extend({
template: "FieldBinaryFileUploader", --扩展binary字段
template_files: "PdcDocument.files",
supportedFieldTypes: ['many2many'],
fieldsToFetch: {
name: { type: 'char' },
mimetype: { type: 'char' },
}
});



上面基础语法上的一些基本操作与使用

ODOO14里面qweb使用案例的更多相关文章

  1. (原创)odoo14下qweb模板的前端与后端语法区别

    1.后端(qweb打包) 后端使用t-inherit 指定继承的模板,使用t-inherit-mode 指定继承的模式,使用xpath定位标记,使用position指定扩展位置. 2.前端 前端仍旧使 ...

  2. 【odoo14】第十五章、网站客户端开发

    odoo的web客户端.后台是员工经常使用的地方.在第九章中,我们了解了如何使用后台提供的各种可能性.本章,我们将了解如何扩展这种可能性.其中web模块包含了我们在使用odoo中的各种交互行为. 本章 ...

  3. 【odoo14】第十四章、CMS网站开发

    第十四章.CMS网站开发** Odoo有一个功能齐全的内容管理系统(CMS).通过拖放功能,你的最终用户可以在几分钟内设计一个页面,但是在Odoo CMS中开发一个新功能或构建块就不是那么简单了.在本 ...

  4. 【odoo14】第十三章、网站开发(对外服务)

    本章我们将介绍一些关于odoo web服务方面的基础知识.进阶的内容,将在第十四章介绍. odoo中的web请求是由python的werkzeug库驱动的.odoo为了操作方便,对werkzeug进行 ...

  5. 【odoo14】第八章、服务侧开发-进阶

    本章代码位于作为GITHUB库 https://github.com/PacktPublishing/Odoo-14-Development-Cookbook-Fourth-Edition 在第五章( ...

  6. 【odoo14】第十六章、odoo web库(OWL)

    odoo14引入了名为OWL(Odoo Web Library)的JavaScript框架.OWL是以组件为基础的UI框架,通过QWeb模板作为架构.OWL与传统的组件系统相比更快,并引入了一些新的特 ...

  7. 【odoo14】第一章、安装odoo的开发环境

    有几种方式去设置odoo的开发环境,我们将逐个介绍他们. 如果你之前没有接触过odoo的开发环境,那么有几个必要的概念你是需要了解的.在这一章节中,我们首先介绍odoo的生态.然后我们在进行介绍odo ...

  8. 【odoo14】odoo 14 Development Cookbook【目录篇】

    网上已经有大佬翻译过odoo12并且在翻译odoo14了.各位着急的可以自行搜索下... 这本书是为了让自己从odoo12转odoo14学习.也是为了锻炼下自己... odoo 14 Developm ...

  9. python爬虫--案例分析之针对简单的html文件

    python爬虫常用的库:Python 库(urllib.BeautifulSoup.requests.scrapy)实现网页爬虫 python爬虫最简单案例分析:  对一个html文件进行分解,获取 ...

  10. odoo14在tree、kanban视图上添加dashboard

    效果图: 实现代码:js:view的类型原来1个js给拆分成了4个: view, controller, renderer, model 1.view:AbstractView的子类,这是工厂类:类需 ...

随机推荐

  1. 理解Rust引用及其生命周期标识(上)

    写在前面 作为Rust开发者,你是否还没有完全理解引用及其生命周期?是否处于教程一看就会,但在实际开发过程中不知所措?本文将由浅入深,手把手教你彻底理解Rust引用与生命周期. 关于本文的理解门槛 本 ...

  2. 基于自注意力机制的轻量级人体姿态估计(Lightweight Human Pose Estimation Based on Self-Attention Mechanism)

    写在前面 本文是一篇于2023年3月21日发表在2023 International Conference on Big Data, Environmental Industry and Materi ...

  3. Java Map一些基本使用方法

    1 // Map key值不能相同,value值可以相同 2 // HashMap中的Entry对象是无序排列的 3 4 // 实例化1 5 Map<String, String> map ...

  4. 删除空白行,报错 raise KeyError(list(np.compress(check, subset))) KeyError: ['姓名']

    之前这段程序跑完后没报错,经调试发现到这一句报错 > df.dropna(subset=['姓名'],inplace=True) 意思是删除'姓名'列 含有'NAN'的行 思考第一步:应该是 d ...

  5. mysql安装以及2059 - Authentication plugin 'caching_sha2_password' cannot be loaded:报错的解决办法

    2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_ ...

  6. Golang 入门 : 包名与导入路径

    math/rand包有一个Intn函数,可以生成一个随机数,所以我们需要导入math/rand.然后调用rand.Intn生成随机数. 等一下!Intn来自math/rand包,那为什么我们调用包的时 ...

  7. http://eslint.org/docs/rules/semi

    报错: Errors: 88 http://eslint.org/docs/rules/semi 56 http://eslint.org/docs/rules/quotes 34 http://es ...

  8. chrome播放webRTC的H265视频方法

    需求描述 最近有需求实现浏览器直接播放摄像头视频 鉴于Camera本身支持了rtsp流,本想web直接播放rtsp,但是还不行,搜了一下webRTC实现的效果和延迟会好一些.于是就使用了mediaMT ...

  9. Python 生成器说明

    生成器 python 生成器 常规形态 # list def square_numbers(nums: list): squared_nums = [] for i in nums: squared_ ...

  10. Visual Studio 2010 SDK

    HTML 5 Intellisense for Visual Studio 2010 and 2008 Visual Studio 2010 SDK Visual Studio 2010 SP1 SD ...