1
votes

I try to test custom widget from js reference and I get error in debugger:

Error: QWeb2: Template 'some.template' not found

qweb.xml was properly set in manifest, because when I extend ListController and use another template, it works correctly.

Here is template definition, which I use in 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>

I tried to change <template> -> <templates>, totally removed tag "template" but still get the same error message.

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");

})

Manifest:

# -*- 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',
    ],
}

Any idea how I need to modify this template to make the widget working correctly and in which table in db odoo stores these templates?

5
Could you put the js code and the manifest file ?Charif DZ
sure, already updated my questionedward

5 Answers

1
votes

You can try changing

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

to

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

It happens with me sometimes, by specifying static xml file name, it does not render that template. But by just loading all .xml files by using *, templates are loaded.

1
votes

I was running into this same issue and needed to put my QWeb code into static/src/xml/base.xml in order for Odoo to recognize it.

You can check to see if Odoo is loading the QWeb by going to this URL on your Odoo instance:

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

Such as:

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

For comparison, you can see a successful output by using mods=web to load the QWeb assets for the web module.

1
votes

To solve this issue I used as workaround Widget.xmlDependencies:

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

but the main reason I think was cache in PyCharm which I didn't invalidate.

1
votes

After having done some code reading, IMO, I realized the official documentation might not have pointed out clearly how to use templates in frontend.

To summarize my understanding:

The 'qweb' field in manifest is mainly designed for webclient (i.e. the backoffice), not the website. When entering webclient, a request to /web/webclient/qweb is made to retrieve all the templates of installed modules.

In order to use templates in website (i.e. frontend), synchronous and asynchronous ways both exist.

  • Synchronous way: Use qweb.add_template. When parameter is template content itself or a DOM node, template is loaded in a synchronous way. (While param is a URL, then it fires up an ajax request to server to fetch content.)

    qweb.add_template is mentioned in https://www.odoo.com/documentation/13.0/reference/qweb.html

  • Asynchronous way:

    1. Use ajax.loadXML which you can use anywhere you want to start loading template from a URL.
    2. Use xmlDependencies which you specify in widget definition. And if you dig into the code in widget.js, you can see ajax.loadXML is being used in willStart.

There are discussions regarding qweb.add_template vs ajax.loadXML See https://github.com/OCA/pylint-odoo/issues/186 and https://github.com/odoo/odoo/issues/20821

FYI.

0
votes

I guess you may need to make sure that the js definition refers to the module name correctly

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

you should also register your js function with something like:

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

for more info https://www.odoo.com/documentation/11.0/reference/javascript_reference.html#registries