如何在QWeb报表中添加Python逻辑?(含日期对比示例)
QWeb模板中实现Python逻辑的说明
可以在QWeb模板里嵌入有限的Python表达式逻辑,但不能直接在XML里随意调用Python模块或执行复杂代码,得依赖模板上下文传递的变量和方法。你的示例里直接用Date.today()会报错,因为模板上下文默认没有导入Date类,下面给你讲正确的实现方式:
1. 核心限制
QWeb支持在t-if、t-foreach等指令中使用Python表达式,但这些表达式只能引用:
- 报表上下文里的变量(比如
docs、自定义传入的变量) - Odoo模板内置的过滤器和工具(比如
format_date) - 模型对象的字段和方法(比如
factura.invoice_date)
不能直接在模板里导入Python模块(比如from datetime import date)或定义函数。
2. 日期对比的正确实现
要实现发票日期和当天日期的对比,推荐把当天日期提前传到模板上下文:
步骤1:在Python报表控制器中传递变量
在你的报表对应的Python文件(比如report/report_cierre_de_caja.py)里,定义报表的渲染方法,把当天日期传入上下文:
from odoo import models, api from datetime import date class ReportCierreDeCaja(models.AbstractModel): _name = 'report.your_module.report_cierre_de_caja' _description = 'Reporte de Cierre de Caja' @api.model def _get_report_values(self, docids, data=None): docs = self.env['account.move'].browse(docids) return { 'doc_ids': docids, 'docs': docs, 'today_date': date.today(), # 把当天日期传到模板 }
步骤2:修改QWeb模板中的条件
在XML模板里,用传入的today_date做对比:
<odoo> <template id="report_cierre_de_caja_id"> <t t-call="web.basic_layout"> <div class="page"> <h2>Reporte de Cierre de Caja</h2> <table class="table table-sm table-striped"> <thead> <tr> <th>Número de Factura</th> <th>Monto Total</th> </tr> </thead> <tbody> <t t-foreach="docs" t-as="factura"> <!-- 使用传入的today_date做对比 --> <t t-if="factura.invoice_date == today_date"> <tr> <td> <t t-esc="factura.name" /> </td> <td> <t t-esc="factura.amount_total" /> </td> </tr> </t> </t> </tbody> </table> </div> </t> </template> </odoo>
3. 复杂逻辑的处理建议
如果报表需要更复杂的逻辑(比如数据聚合、多条件计算),不要在模板里硬写,应该:
- 在模型中定义计算字段,把逻辑封装在Python层
- 或者在报表控制器中提前处理好数据,再把处理后的结果传到模板
这样代码更易维护,也符合Odoo的MVC架构设计。
内容的提问来源于stack exchange,提问作者damar
相关产品推荐
相关产品推荐

