Odoo 11自定义销售模块现有报告报错及模块报告空白求助
解决Odoo销售报告自定义的两个核心问题
问题1:修改原报告而非自定义模板生效
你当前的第一个模板直接继承了sale.report_saleorder_document,这会直接修改Odoo自带的销售订单报告视图——相当于在原报告的基础上打补丁,自然会改动原报告,而你的自定义报告因为没有正确关联专属的修改内容,所以显示为空。
问题2:报错“cannot be located in the parent view”
这个错误大概率是模板调用时的上下文对象不匹配导致的:你在自定义容器模板里用o作为循环变量,但继承的原视图里使用的是doc作为对象名,xpath查找doc.name时找不到对应节点,就会抛出无法定位父视图节点的错误。
正确的实现方案
你需要创建独立的自定义报告模板,既继承原报告的结构,又确保只作用于自己的报告,不会影响原模板。
修改后的代码示例:
<!-- 自定义报告内容模板:继承原销售报告,仅修改需要的部分 --> <template id="report_real_estate_rental_content" inherit_id="sale.report_saleorder_document"> <xpath expr="//span[@t-field='doc.name']" position="after"> <p>JE SUIS LA</p> </xpath> </template> <!-- 自定义报告容器:负责循环渲染文档,传递正确的上下文 --> <template id="report_real_estate_rental"> <t t-call="web.html_container"> <t t-foreach="docs" t-as="doc"> <t t-call="web.external_layout"> <div class="page"> <!-- 传递当前文档对象给内容模板,确保xpath能找到对应节点 --> <t t-call="report_real_estate_rental_content" t-set="doc" t-value="doc"/> </div> </t> </t> </t> </template>
关键细节说明
- 隔离原报告与自定义报告:将内容修改和容器渲染分开,自定义内容模板只负责继承修改,容器模板负责绑定自己的报告上下文,这样不会污染原报告的视图。
- 上下文传递:用
t-set把循环中的doc对象传递给内容模板,确保原视图里的doc.name能正确匹配到当前渲染的订单数据,解决节点定位失败的报错。 - 绑定报告动作:别忘了在模块里定义对应的报告动作,让Odoo知道什么时候用你的自定义报告:
<record id="action_real_estate_rental_report" model="ir.actions.report"> <field name="name">Real Estate Rental Report</field> <field name="model">sale.order</field> <!-- 替换成你的目标模型 --> <field name="report_type">qweb-html</field> <field name="report_name">your_module.report_real_estate_rental</field> <field name="report_file">your_module.report_real_estate_rental</field> </record>
额外检查项
- 确保模块依赖
sale:在__manifest__.py的depends列表里添加sale,保证原报告视图能被正确加载。 - 清除缓存并升级模块:修改模板后,重启Odoo服务并升级模块,同时清除浏览器缓存,避免旧模板残留。
- 验证xpath准确性:如果原报告结构有变动,可以用浏览器开发者工具查看原报告的HTML结构,调整
expr的路径确保能定位到目标节点。
内容的提问来源于stack exchange,提问作者Cherifi Fares




