You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:22:19