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

Odoo16:模板中docs变量的定义位置及自定义模板变量方法

关于Odoo报表中docs变量及自定义变量的问题解答

一、docs变量的识别逻辑与默认定义

  • docs是Odoo报表引擎默认内置的变量,无需在模型中手动定义。
  • 当你创建报表动作(ir.actions.report)并绑定对应模型后,Odoo在渲染报表时会自动处理:将当前需要打印的记录集合直接赋值给docs变量。
    • 批量打印多条记录时,docs是包含所有选中记录的模型记录集;
    • 打印单条记录时,docs是仅包含该条记录的记录集(保持列表结构以兼容批量打印逻辑)。

二、添加自定义变量的几种方法

1. 通过报表动作上下文传递固定值

在报表动作的context字段中直接添加键值对,比如:

# 报表动作的context配置示例
{'text1': 'hello'}

之后在QWeb模板中直接调用该变量:

<p>{{ text1 }}</p>

这种方式适合传递固定不变的静态值。

2. 重写报表类的_get_report_values方法(动态值推荐)

如果需要根据记录或业务逻辑生成动态变量,可在报表对应的Python类中重写该方法,将自定义变量加入返回的字典:

from odoo import models

class CustomReport(models.AbstractModel):
    _name = 'report.your_module.report_template_id'  # 替换为实际报表模板ID

    def _get_report_values(self, docids, data=None):
        # 调用父类方法获取默认值(包含docs变量)
        report_values = super()._get_report_values(docids, data=data)
        
        # 添加自定义变量,支持动态生成逻辑
        report_values['text1'] = 'hello'
        # 示例:从绑定模型的记录中获取动态值
        docs = self.env['your.model'].browse(docids)
        report_values['dynamic_text'] = docs.name if docs else '默认文本'
        
        return report_values

模板中直接使用变量名调用即可:

<p>静态自定义文本:{{ text1 }}</p>
<p>动态自定义文本:{{ dynamic_text }}</p>

3. 在QWeb模板内直接定义变量

如果变量仅在模板内使用且逻辑简单,可使用QWeb的t-set标签定义:

<!-- 在模板需要的位置定义变量 -->
<t t-set="text1" t-value="'hello'"/>

<!-- 后续使用该变量 -->
<div>{{ text1 }}</div>

内容的提问来源于stack exchange,提问作者NqanVo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 04:31:10