Odoo 17 QWeb报表用web.html_container时货币符号显示异常求助
Odoo 17 QWeb报表货币符号显示异常问题解决
问题原因
web.html_container是最基础的HTML容器模板,只提供最外层结构,没有自动添加UTF-8编码声明,也不包含货币符号渲染所需的样式和JS资源。而web.basic_layout会自动插入<meta charset="UTF-8">标签,同时加载处理货币Unicode字符的相关依赖,保证像₱这类符号能正确解析。你看到的 ₱是典型的UTF-8字符被当作ISO-8859-1编码解析导致的乱码,核心问题就是缺少UTF-8编码声明。
修复方案
方案一:手动添加编码声明和依赖资源
直接在模板里添加UTF-8编码的meta标签,同时引入Odoo内置的通用资源,确保货币渲染正常:
<odoo> <data> <template id="report_voucher"> <t t-call="web.html_container"> <t t-foreach="docs" t-as="o"> <html> <head> <meta charset="UTF-8"/> <!-- 引入Odoo通用资源,处理货币渲染 --> <t t-call="web._assets_common"/> <t t-call="web._assets_backend"/> </head> <body> <!-- 报表内容 --> <t t-esc="line.debit" t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/> </body> </html> </t> </t> </template> </data> </odoo>
方案二:复用basic_layout的编码结构
如果不想改动太多,可以直接嵌套web.basic_layout,它会自动处理编码和资源加载,你只需要在内部写报表内容:
<odoo> <data> <template id="report_voucher"> <t t-call="web.html_container"> <t t-foreach="docs" t-as="o"> <t t-call="web.basic_layout"> <div class="page"> <!-- 报表内容 --> <t t-esc="line.debit" t-options="{'widget': 'monetary', 'display_currency': o.currency_id}"/> </div> </t> </t> </t> </template> </data> </odoo>
说明
- 方案一适合需要高度自定义报表结构的场景,灵活度更高;
- 方案二更简洁,直接复用Odoo的内置配置,避免遗漏必要依赖。
内容的提问来源于stack exchange,提问作者law rence
相关产品推荐
相关产品推荐

