ir.actions.client 介绍
ir.actions.client 是odoo actions事件的一种,触发一个在客户端实现(即js文件中定义的函数,通过core.action_registry.add(tag,函数名) 注册到odoo中)动作
- tag -- action在客户端的标识符,一般是一个专用的字符串,在js文件中注册该动作时指定。
- params (可选) -- 用来传给客户端动作的,字典格式
- target (可选) -- current:当前内容区打开action;fullscreen:以全屏模式打开;new:以新窗口打开。
- context-- 作为额外数据,传递给客户端函数。
实现方式主要有一下几步:
1. 通过继承扩展的方式建立一个m_custome_list.js,里面主要是关联qweb视图,对qweb页面传递数据,渲染视图
在 项目目录/static/src/js 建立 m_custome_list.js 文件
-
m_custome_list.js
odoo.define('custom_page.demo', function (require) { "use strict"; var AbstractAction = require('web.AbstractAction'); var core = require('web.core'); var CustomPageDemo = AbstractAction.extend({ // 对某个类关联click事件 events: {'click .demo-submit': '_onSubmitClick', 'click .db_add_data': '_onAddData'}, // 初始化,可以在action 里传入参数 init: function (parent, action, option) { // 保存传递的参数 this.params = action.params; this._super.apply(this, arguments); }, // 渲染视图 renderElement: function () { this._super.apply(this, arguments); // 渲染qwb 视图,并传值 this.$('.o_content').html( core.qweb.render('DemoPage', {'params': this.params})); }, _onSubmitClick: function (e) { e.stopPropagation(); alert('Submit clicked!'); }, // 添加一条数据 _onAddData: (e)=> { e.stopPropagation(); window.alert('添加成功'); }, }); // add方法对动作进行注册,第一个参数表示注册的动作名,第二个参数是要注册的动作对象; core.action_registry.add('custom_page.demo', CustomPageDemo); return CustomPageDemo; });
2. 编写一个qweb视图,用来承载需要显示的数据样式
在 项目目录/static/src/xml 建立 m_custome_list.xml 文件
<?xml version="1.0" encoding="UTF-8"?> <templates id="template" xml:space="preserve"> <t t-name="DemoPage"> <div style="margin:0 auto; text-align:center;" class="o_content"> <table class="table table-striped"> <tr> <th>标题</th> <th>内容</th> <th>创建日期</th> </tr> <t t-foreach="params.contentList" t-as="item"> <tr> <td><t t-esc="item.title"/></td> <td><t t-esc="item.content"/></td> <td><t t-esc="item.date"/></td> </tr> </t> </table> <button type="button" class="db_add_data btn btn-primary">增加数据</button> </div> </t> </templates>
3. 在需要显示client的model,调用显示client方法
model 调用client方法, 在model关联的xml视图页面,增加一个按钮,绑定show_list方法,也可以在任何方法中返回client和返回actions.window 一样
def show_list(self): content_list = [ {'title': '内容一', 'content': '我是内容一一,在想看看1', 'date': '2021-08-08'}, {'title': '内容二', 'content': '我是内容二二,在想看看2', 'date': '2021-08-09'}, {'title': '内容三', 'content': '我是内容三三,在想看看3', 'date': '2021-08-10'}, {'title': '内容四', 'content': '我是内容四四,在想看看4', 'date': '2021-08-11'}, ] info = { 'title': '测试列表循环', 'contentList': content_list } return { 'type': 'ir.actions.client', 'name': '列表信息', 'tag': 'custom_page.demo', 'params': info, 'target': 'new', }
4. 加载自己写的m_custome_list.js文件
在 项目目录/views/ 建立 js_and_css.xml 文件, 用来加载自己写的js,别忘了在mainfast.py 中加载这个js_and_css.xml
<?xml version="1.0" encoding="UTF-8"?> <odoo> <template id="assets_end" inherit_id="web.assets_backend"> <xpath expr="." position="inside"> <script src="/customtree/static/src/js/m_custome_list.js" type="text/javascript"/> </xpath> </template> </odoo>
5. 在mainfast.py 中加载自己写的qweb文件 m_custome_list.xml
'data': [ 'security/ir.model.access.csv', 'views/js_and_css.xml', 'views/views.xml', ], 'qweb': [ 'static/src/xml/base.xml' ],