Odoo JavaScript实现点击复制char字段值

Odoo自定义字段复制组件
本文介绍了一个Odoo框架下的自定义字段复制组件实现,该组件允许用户通过简单的按钮操作复制表单中的字符型字段内容到剪贴板。文章详细展示了如何扩展Odoo的基本字段并添加复制按钮,同时确保在复制操作完成后能够正确通知用户。
部署运行你感兴趣的模型镜像

odoo.define('web_char_field_copy.char_field_copy', function (require) {
    'use strict';
    var FieldChar = require('web.basic_fields').FieldChar;
    var fieldRegistry = require('web.field_registry');
    var field = require('web.relational_fields');
    const ListRenderer = require("web.ListRenderer");

    var CopyFieldChar = FieldChar.extend({
        _renderReadonly: function () {
            if (this.attrs.widget === 'char_field_copy' && this.$el.hasClass('o_field_widget')) {
                var res = this._super.apply(this, arguments);
                //  为这个节点增加一个复制按钮
                var $value = $('<button type="button" class="o_char_field_copy_button fa fa-copy" style="border:none"/>');
                this.$(this.el.currentTarget).append($value)
                //  给按钮增加事件
                this.$(":button").on('click', this._Copy_data.bind(this))
                return res;
            }
        },

        _Copy_data: function (ev) {
            var self = this;
            //  给按钮增加一个class, 因为点击复制按钮的时候自动跳转form视图(此处先加上class,然后在跳转form的函数判断是否有这个class)
            this.$(':button').addClass('no_open_raw')
            //  复制text
            var clipboard = new window.ClipboardJS('.o_field_widget', {
                target: function (ev) {
                    //  复制完毕之后将添加的class删除,否则此条记录点击没有反应,不会进入form视图
                    self.$(':button').removeClass('no_open_raw')
                    return self.$(ev.currentTarget)[0];
                },
                container: this.el
            });
            // alert成功信息
            // alert('复制成功!')
            self.do_notify('成功','复制成功, 请直接粘贴!', false)
        }
    });

    ListRenderer.include({
        /*
       
        * */
        _onRowClicked: function (ev) {
            var has_class = this.$(':button').hasClass('no_open_raw')
            if (!has_class) {
                return this._super.apply(this, arguments)
            }
        }
    })
    fieldRegistry.add('char_field_copy', CopyFieldChar);
})


 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

Odoo实现类似Excel VLOOKUP功能的批量查询,通常可以通过以下几种方式来完成: 1. **使用`search`和`read`方法**:Odoo模型提供了`search`方法用于查找记录,并结合`read`方法获取所需字段的数据。这种方式类似于VLOOKUP的功能,即根据某个条件查找并读取相关数据。 ```python # 示例:通过客户名称查找销售订单 orders = self.env['sale.order'].search([('partner_id.name', '=', 'John Doe')]) order_data = orders.read(['name', 'amount_total']) ``` 2. **使用`mapped`方法**:如果需要从多个记录中提取特定字段,可以使用`mapped`方法。它会返回一个包含所有匹配记录指定字段的列表,适用于一对一或一对多的映射场景。 ```python # 示例:获取所有符合条件的订单编号 order_names = self.env['sale.order'].search([('state', '=', 'draft')]).mapped('name') ``` 3. **使用SQL查询**:对于更复杂的查询需求,可以直接执SQL语句以提高性能。这种方式适合处理大量数据时,能够有效减少数据库交互次数。 ```python # 示例:直接执SQL查询 self.env.cr.execute(""" SELECT so.name, so.amount_total FROM sale_order so JOIN res_partner rp ON so.partner_id = rp.id WHERE rp.name = %s """, ('John Doe',)) results = self.env.cr.fetchall() ``` 4. **使用`fields.Many2one`的关系字段**:在模型定义中,可以通过`fields.Many2one`建立两个模型之间的关联关系,然后利用这种关系自动进数据检索。这与VLOOKUP中的查找表概念相似。 ```python # 示例:在模型中定义Many2one字段 class SaleOrder(models.Model): _name = 'sale.order' partner_id = fields.Many2one('res.partner', string='Customer') customer_name = fields.Char(related='partner_id.name', string='Customer Name') ``` 5. **使用`compute`字段**:如果需要动态计算某些字段,可以根据其他模型的数据创建计算字段。这种方法可以在不修改数据库结构的情况下提供额外的信息。 ```python # 示例:定义计算字段 class SaleOrderLine(models.Model): _name = 'sale.order.line' @api.depends('product_id') def _compute_product_category(self): for line in self: if line.product_id: line.product_category = line.product_id.categ_id.name else: line.product_category = False product_category = fields.Char(compute='_compute_product_category', store=True) ``` 6. **使用`onchange`方法**:当用户界面中的某个字段发生变化时,`onchange`方法可以触发服务器端逻辑更新其他字段。这对于即时反馈非常有用。 ```python # 示例:定义onchange方法 @api.onchange('partner_id') def onchange_partner_id(self): if self.partner_id: self.update({ 'partner_address': self.partner_id.contact_address, }) else: self.update({'partner_address': False}) ``` 7. **使用`ir.actions.report`报告引擎**:如果你希望将这些查询结果呈现为报表形式,可以考虑使用Odoo内置的报告系统。通过QWeb模板,你可以轻松生成PDF或HTML格式的文档。 8. **使用`web.controllers.main`自定义控制器**:为了实现前端JavaScript与后端Python代码之间的通信,你可以编写自定义控制器暴露REST API接口,允许网页客户端发起请求获取数据。 9. **使用`bus.Bus`消息总线**:对于实时应用来说,可能还需要用到Odoo的消息传递机制。通过`bus.Bus`,不同模块之间或者客户端与服务器之间能够发送通知事件。 10. **使用`queue_job`队列作业**:大规模数据处理任务可能会耗时较长,这时应该将其放入后台异步执。为此,可以采用`queue_job`模块安排作业排队运[^1]。 以上每种技术都有其适用场景及优缺点,在实际开发过程中应根据具体业务需求选择最合适的方法。此外,考虑到性能优化问题,建议尽可能批量操作而非逐条处理;同时注意合理索引数据库表以加速搜索过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值