我尝试从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的哪个表中存储了这些模板?
答案 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=web
为web
模块加载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
异步方式:
关于 qweb.add_template 与 ajax.loadXML 的讨论 参见https://github.com/OCA/pylint-odoo/issues/186和https://github.com/odoo/odoo/issues/20821
仅供参考。