自定义小部件js无法识别来自qweb

时间:2019-10-12 13:26:24

标签: odoo odoo-12

我尝试从js reference测试自定义窗口小部件,但在调试器中出现错误:

  

错误:QWeb2:找不到模板'some.template'

在清单中正确设置了qweb.xml,因为当我扩展ListController并使用另一个模板时,它可以正常工作。

这是模板定义,我在qweb.xml中使用它:

<?xml version="1.0" encoding="UTF-8"?>
<template>
    <div t-name="some.template">
        <span class="val"><t t-esc="widget.count"/></span>
        <button>Increment</button>
    </div>
</template>

我尝试更改<template>-> <templates>,完全删除了标签“模板”,但仍然收到相同的错误消息。

JS:

odoo.define('working.test', function (require) {
var Widget = require('web.Widget');
var Counter = Widget.extend({
    template: 'some.template',
    events: {
        'click button': '_onClick',
    },
    init: function (parent, value) {
        this._super(parent);
        this.count = value;
    },
    _onClick: function () {
        this.count++;
        this.$('.val').text(this.count);
    },
});

// Create the instance
var counter = new Counter(this, 4);
// Render and insert into DOM
counter.appendTo(".o_nocontent_help");

})

清单:

# -*- coding: utf-8 -*-
{
    'name': "testwidget",

    'summary': """
        Short (1 phrase/line) summary of the module's purpose, used as
        subtitle on modules listing or apps.openerp.com""",

    'description': """
        Long description of module's purpose
    """,

    'author': "My Company",
    'website': "http://www.yourcompany.com",

    # Categories can be used to filter modules in modules listing
    # Check https://github.com/odoo/odoo/blob/12.0/odoo/addons/base/data/ir_module_category_data.xml
    # for the full list
    'category': 'Uncategorized',
    'version': '0.1',

    # any module necessary for this one to work correctly
    'depends': ['base'],
    'qweb': ['static/qweb.xml'],

    # always loaded
    'data': [
        # 'security/ir.model.access.csv',
        'views/views.xml',
        'views/web_asset.xml',
    ],
    # only loaded in demonstration mode
    'demo': [
        'demo/demo.xml',
    ],
}

有什么主意,我需要如何修改此模板以使小部件正常工作以及db odoo的哪个表中存储了这些模板?

5 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,需要将我的QWeb代码放入static/src/xml/base.xml中,以便Odoo识别它。

您可以通过转到Odoo实例上的以下URL来检查Odoo是否正在加载QWeb:

<odoo_instance>/web/webclient/qweb?mods=<my_module_name>

例如:

localhost:8069/web/webclient/qweb?mods=test

为进行比较,您可以使用mods=webweb模块加载QWeb资产来看到成功的输出。

答案 1 :(得分:1)

为解决此问题,我使用了替代方法Widget.xmlDependencies:

 xmlDependencies: ['/test/static/qweb.xml']

但是我认为主要原因是我没有使PyCharm缓存无效。

答案 2 :(得分:0)

我想您可能需要确保js定义正确引用了模块名称

odoo.define('MODULE TECHNICAL NAME SHOULD BE HERE.test', function (require) {});

您还应该使用以下方式注册js函数:

core.action_registry.add("module_name.name", Widget_Extend);

有关更多信息,https://www.odoo.com/documentation/11.0/reference/javascript_reference.html#registries

答案 3 :(得分:0)

您可以尝试更改

'qweb': ['static/qweb.xml'],

'qweb': ['static/*.xml'],

有时我会发生这种情况,通过指定静态xml文件名,它不会呈现该模板。但是通过仅使用*加载所有.xml文件,即可加载模板。

答案 4 :(得分:0)

在阅读了一些代码之后,IMO,我意识到官方文档可能没有明确指出如何在前端使用模板。

总结我的理解:

清单中的“ qweb”字段主要是为 webclient (即 backoffice )而不是网站设计的。输入webclient时,将请求/ web / webclient / qweb检索已安装模块的所有模板。

为了在网站(即 frontend )中使用模板,存在同步和异步两种方式。

  • 同步方式:使用 qweb.add_template 。当参数是模板内容本身或DOM节点时,模板将以同步方式加载。 (虽然param是一个URL,然后它向服务器发出ajax请求以获取内容。)

    https://www.odoo.com/documentation/13.0/reference/qweb.html中提到了

    qweb.add_template

  • 异步方式:

    1. 使用 ajax.loadXML ,您可以在任何要从URL开始加载模板的位置使用它。
    2. 使用您在窗口小部件定义中指定的 xmlDependencies 。而且,如果您深入研究widget.js中的代码,您会看到 willStart 中正在使用ajax.loadXML。

关于 qweb.add_template ajax.loadXML 的讨论 参见https://github.com/OCA/pylint-odoo/issues/186https://github.com/odoo/odoo/issues/20821

仅供参考。