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
相关产品推荐
相关产品推荐

