在 Odoo 13 中动态重新呈现模板的最佳方式
Best way to dynamically re-render a template in Odoo 13
我正在尝试在 QWeb 网页上发生某些更改(元素上的 onchange
事件)后使用一组新数据重新呈现模板。我习惯于使用像 Vue 这样的 JS 框架,我在 QWeb 网页上更新值时遇到问题。
我没有在文档中看到关于如何执行此操作的明确解释,并且在搜索互联网和源代码时,我看到了许多不同的答案,大概是针对不同的 Odoo 版本。但是两者都不行。
我看到了两种主要的方法:
- 内部 Python 控制器
- 内部 JavaScript 小部件
在 Python 控制器内部,我看到了不同的语法,我不确定何时使用什么。例如:
# First method
@http.route('/test', type='json' auth='user', website=True)
def object(self, **kw):
return http.request.render('template.name', {
'value': kw.get('value', 0),
})
# Second method
@http.route('/test', type='json' auth='user', website=True)
def object(self, **kw):
return request.env['ir.ui.view'].render_template('template.name', {
'value': kw.get('value', 0),
})
它们之间有什么区别吗?同样出于某种原因,它在从 JavaScript 调用它并使用 type='json'
时不会呈现任何内容。它仅在我使用 type='http'
并直接从浏览器转到那里时呈现 - 我需要一个 JS 事件来导致重新呈现。
我还看到可以像这样从 JavaScript 渲染模板:
_onChange: function () {
console.log("something changed!");
return this._rpc({
route: '/test',
params: {
value: 1,
}
}).then(function (data) {
this.$el.html(QWeb.render('template.name', {
value: data.value
}));
});
},
但由于某种原因我收到错误 Template 'template.name' not found
。
我现在很困惑,不知道下一步该怎么做。我可以向控制器发送数据或从控制器发送数据。但我不知道如何更新 QWeb 上的变量。请帮忙。
我设法使用 python 中的第二种方法呈现模板:
return request.env['ir.ui.view'].render_template("konfigurator.listing", {
'test': kw.get('value', 0),
})
然后在self.$el.html(data)
中使用JS内部的返回值:
return this._rpc({
route: '/calculate_order',
params: {
value: 4,
}
}).then(function (data) {
self.$el.html(data);
});
但现在我认为改变这种方法并使用 JavaScript 动态呈现内容而不是再次呈现整个模板要好得多。
我正在尝试在 QWeb 网页上发生某些更改(元素上的 onchange
事件)后使用一组新数据重新呈现模板。我习惯于使用像 Vue 这样的 JS 框架,我在 QWeb 网页上更新值时遇到问题。
我没有在文档中看到关于如何执行此操作的明确解释,并且在搜索互联网和源代码时,我看到了许多不同的答案,大概是针对不同的 Odoo 版本。但是两者都不行。
我看到了两种主要的方法:
- 内部 Python 控制器
- 内部 JavaScript 小部件
在 Python 控制器内部,我看到了不同的语法,我不确定何时使用什么。例如:
# First method
@http.route('/test', type='json' auth='user', website=True)
def object(self, **kw):
return http.request.render('template.name', {
'value': kw.get('value', 0),
})
# Second method
@http.route('/test', type='json' auth='user', website=True)
def object(self, **kw):
return request.env['ir.ui.view'].render_template('template.name', {
'value': kw.get('value', 0),
})
它们之间有什么区别吗?同样出于某种原因,它在从 JavaScript 调用它并使用 type='json'
时不会呈现任何内容。它仅在我使用 type='http'
并直接从浏览器转到那里时呈现 - 我需要一个 JS 事件来导致重新呈现。
我还看到可以像这样从 JavaScript 渲染模板:
_onChange: function () {
console.log("something changed!");
return this._rpc({
route: '/test',
params: {
value: 1,
}
}).then(function (data) {
this.$el.html(QWeb.render('template.name', {
value: data.value
}));
});
},
但由于某种原因我收到错误 Template 'template.name' not found
。
我现在很困惑,不知道下一步该怎么做。我可以向控制器发送数据或从控制器发送数据。但我不知道如何更新 QWeb 上的变量。请帮忙。
我设法使用 python 中的第二种方法呈现模板:
return request.env['ir.ui.view'].render_template("konfigurator.listing", {
'test': kw.get('value', 0),
})
然后在self.$el.html(data)
中使用JS内部的返回值:
return this._rpc({
route: '/calculate_order',
params: {
value: 4,
}
}).then(function (data) {
self.$el.html(data);
});
但现在我认为改变这种方法并使用 JavaScript 动态呈现内容而不是再次呈现整个模板要好得多。