如何在Odoo POS中显示产品默认编码及实现指定格式咨询
在Odoo POS中显示产品默认编码(内部参考)的实现方案
嘿,这个需求完全能实现,而且强烈建议用继承的方式来做,千万别直接修改Odoo核心的models.js文件——不然下次升级Odoo你的改动就全没了,维护起来超麻烦。下面给你两个靠谱的实现方案:
方法1:通过自定义模块继承POS产品模型(推荐)
这种方式是全局统一修改产品的显示名称,所有调用产品显示名的地方都会自动变成[默认编码] 产品名称的格式,是最省心的方案。
- 创建自定义模块的JS文件
在你的自定义模块下创建static/src/js/models.js,写入以下代码:
odoo.define('your_module_name.pos_product_reference', function(require) { "use strict"; var models = require('point_of_sale.models'); var _super_product = models.Product.prototype; // 继承POS的Product模型,重写get_display_name方法 models.Product = models.Product.extend({ get_display_name: function() { // 如果产品有默认编码,就加上前缀,否则直接显示产品名 var ref_prefix = this.default_code ? `[${this.default_code}] ` : ''; // 调用父类的方法获取原始产品名,拼接前缀后返回 return ref_prefix + _super_product.get_display_name.call(this); }, }); return models; });
记得把your_module_name替换成你实际的模块名称。
- 加载自定义JS文件
在模块的views/templates.xml中添加POS资产引用,让Odoo加载你的自定义JS:
<odoo> <data> <template id="assets_pos_inherit" inherit_id="point_of_sale.assets"> <xpath expr="." position="inside"> <script type="text/javascript" src="/your_module_name/static/src/js/models.js"></script> </xpath> </template> </data> </odoo>
- 生效步骤
- 升级你的自定义模块
- 重启Odoo服务
- 清除浏览器缓存(重要!POS的静态文件缓存很顽固)
- 重新打开POS界面,就能看到产品名称已经带上默认编码了
方法2:修改POS的QWeb模板(精细控制特定位置)
如果只需要在某个特定位置修改显示格式,或者某些地方没有调用get_display_name方法,可以直接修改对应的QWeb模板:
在你的模块views/templates.xml中添加模板继承:
<odoo> <data> <template id="product_display_template_inherit" inherit_id="point_of_sale.product"> <!-- 替换产品名称的显示节点 --> <xpath expr="//span[@class='product-name']" position="replace"> <span class="product-name"> <t t-if="product.default_code">[<t t-esc="product.default_code"/>] </t-t> <t t-esc="product.display_name"/> </span> </xpath> </template> </data> </odoo>
这个方法会直接替换POS产品卡片里的名称显示,适合针对性的调整。
注意事项
- 永远优先用自定义模块继承的方式,不要修改Odoo核心文件,避免升级丢失改动
- 代码中已经处理了产品没有默认编码的情况,不会显示空的
[] - 测试前一定要清除浏览器缓存,否则可能看不到改动效果
内容的提问来源于stack exchange,提问作者dewa ruci
相关产品推荐
相关产品推荐

