odoo自定义widget组件两种方式

odoo 自定义一个widget

方式一

js
odoo.define('your_module.custom_widget', function (require) {
    "use strict";

    const core = require('web.core');
		
    const QWeb = core.qweb;
    const {useState, useRef} = owl.hooks;

    // 方式1 函数方式
    const AbstractField = require('web.AbstractField'); //这种xml不能加owl=1  否则报模板找不到
    const fieldRegistry = require('web.field_registry');
    // 实例化声明 否则报 You can only instanciate objects with the 'new' operator
    const your_custom_widget = AbstractField.extend({
        template: 'your_module.custom_widget',
        init: function (parent, options) {
            this._super.apply(this, arguments);
             初始化代码
        },
        start: function () {
            return this._super.apply(this, arguments);
             启动代码
        },
        render: function() {
            QWeb.add_template('./dynamic_progress_bar.xml');
        },
         其他自定义方法
    });

    fieldRegistry.add('your_module.custom_widget', your_custom_widget);

    return {
        your_custom_widget: your_custom_widget,
    };

    //  方式2 类的方式声明
    // const AbstractField = require('web.AbstractFieldOwl');  //这种xml必须加owl=1 否则报模板找不到
    // const fieldRegistry = require('web.field_registry_owl');

    // class FieldValue11 extends AbstractField {
    //     static template = 'your_module.custom_widget';

    //     constructor(...args) {
    //         super(...args);
    //     }

    //     setup() {
    //         super.setup();
    //         this.state = useState({
    //             data: {},
    //             showMap: false,
    //             address: ""
    //         });
    //     }


    //     mounted() {
    //         console.log(this,11122);
    //     }
    // }

    // fieldRegistry.add('your_module.custom_widget', FieldValue11);

    // return {
    //     FieldValue11: FieldValue11,
    // };
});
xml不带owl
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
    <div t-name="your_module.custom_widget">
        <div class="test">111</div>
    </div>
</templates>
xml带owl
注意要加owl="1" 否则报模板找不到
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
    <div t-name="your_module.custom_widget" owl="1"> 
        <div class="test">111</div>
    </div>
</templates>

最后 注册在__manifest__.py文件中,并在view<field name="xxx" widget="your_module.custom_widget"/>使用

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Odoo自定义 Widgets 可以帮助我们在页面上添加自定义的 HTML 元素和 JavaScript 代码。下面是一个基础教程,介绍如何创建自定义 Widgets。 1. 创建一个模块 首先,我们需要创建一个新的模块。在 Odoo 中,所有的自定义组件都应该包含在一个模块中。 2. 创建一个 Widgets 类 接下来,我们需要创建一个 Widgets 类。Widgets 类用于创建自定义的 HTML 元素和 JavaScript 代码。下面是一个简单的例子: ```python odoo.define('my_module.my_widget', function(require) { 'use strict'; var core = require('web.core'); var Widget = require('web.Widget'); var MyWidget = Widget.extend({ template: 'my_module.my_widget_template', init: function(parent, options) { this._super(parent, options); }, start: function() { this._super(); } }); return MyWidget; }); ``` 在这个例子中,我们创建了一个叫做 `MyWidget` 的类,并继承了 `Widget` 类。我们还设置了一个 `template` 属性,用于指定要使用的模板文件。 3. 创建一个模板文件 接下来,我们需要创建一个模板文件,用于定义我们的自定义 HTML 元素。这个模板文件应该包含在模块的 `static/src/xml` 目录下。下面是一个简单的例子: ```xml <template id="my_module.my_widget_template"> <div class="my-widget"> <h1>My Widget</h1> <p>This is my custom widget!</p> </div> </template> ``` 在这个例子中,我们定义了一个名为 `my_module.my_widget_template` 的模板,它包含一个 `div` 元素和一些文本。 4. 注册我们的 Widgets 类 最后,我们需要在模块中注册我们的 Widgets 类。这样,我们的自定义组件才能被正确地加载。下面是一个简单的例子: ```python odoo.define('my_module', function(require) { 'use strict'; var MyWidget = require('my_module.my_widget'); core.action_registry.add('my_module.my_widget', MyWidget); return { MyWidget: MyWidget }; }); ``` 在这个例子中,我们将 `MyWidget` 类添加到 `action_registry` 中,以便它可以被其他地方使用。 现在,我们已经成功地创建了一个自定义Widgets。我们可以在 Odoo 中使用它来添加我们想要的自定义 HTML 元素和 JavaScript 代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值