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

Odoo 10:如何将字典数据传递至报表foreach循环?数据为空求助

问题分析与修复步骤

我来帮你一步步排查和解决这个问题,先看代码里几个核心的问题点:

1. 修复生日搜索条件,确保能查到有效员工记录

你当前的搜索条件格式有问题,"%____%-%m-%d"这种写法不符合日期匹配逻辑,导致可能根本查不到员工,自然数据为空。要筛选出当月当天生日的员工,应该只匹配生日字段的月日部分,正确写法如下:

from datetime import date  # 记得导入date模块

def birthday_report(self, context=None):
    # 提取今天的月日,匹配所有年份的同生日员工
    today_month_day = date.today().strftime("-%m-%d")
    rec = self.env['hr.employee'].search([('birthday', 'ilike', today_month_day)])
    print(f"查到的员工数量:{len(rec)}", '*************')  # 先确认是否有匹配记录

用ilike做模糊匹配,直接匹配-月-日的格式,就能忽略年份找到所有今天生日的员工。

2. 正确构造传递给报表的数据结构

你用rec.read()得到的是字典列表(每个元素对应一个员工的字段字典),但存在data['form']里不太合理——form通常用于存储单条表单数据,多条记录建议用更清晰的键名,比如data['employees']:

data = {}
# read()返回列表,每个元素是包含指定字段的员工字典
data['employees'] = rec.read(['name', 'birthday', 'work_email', 'mobile_phone', 'age'])
print(data['employees'], '*************************')

3. 关键:把数据传递给报表

你当前的return语句没有把构造好的data传给报表,导致模板里拿不到数据。必须在get_action调用中加上data=data参数:

return self.env['report'].get_action(
    rec, 
    'hr_birthdays.report_contributionregister_birthdays',
    data=data  # 把构造好的员工列表数据传进报表
)

4. 报表模板中遍历数据

现在在你的QWeb模板里,就可以通过data变量拿到传递的员工列表,用t-foreach循环遍历:

<t t-foreach="data['employees']" t-as="emp">
    <tr>
        <td><t t-esc="emp['name']"/></td>
        <td><t t-esc="emp['birthday']"/></td>
        <td><t t-esc="emp['work_email']"/></td>
        <td><t t-esc="emp['mobile_phone']"/></td>
        <td><t t-esc="emp['age']"/></td>
    </tr>
</t>

更推荐的方式是直接用记录集传递:你不需要调用read(),直接把rec(员工记录集)传给报表,模板里用默认的docs变量循环,还能自动处理字段的显示格式(比如日期格式化):

<t t-foreach="docs" t-as="emp">
    <tr>
        <td><t t-esc="emp.name"/></td>
        <td><t t-esc="emp.birthday"/></td>
        <td><t t-esc="emp.work_email"/></td>
        <td><t t-esc="emp.mobile_phone"/></td>
        <td><t t-esc="emp.age"/></td>
    </tr>
</t>

这种情况下,方法代码可以简化成:

from datetime import date

def birthday_report(self, context=None):
    today_month_day = date.today().strftime("-%m-%d")
    rec = self.env['hr.employee'].search([('birthday', 'ilike', today_month_day)])
    print(f"查到的员工数量:{len(rec)}", '*************')
    
    # 直接传递记录集,模板用docs变量遍历
    return self.env['report'].get_action(
        rec, 
        'hr_birthdays.report_contributionregister_birthdays'
    )

5. 额外检查点

  • 确认报表模板IDhr_birthdays.report_contributionregister_birthdays拼写完全正确;
  • 检查age字段是否是hr.employee模型中存在的有效字段(计算字段要确保逻辑正确,存储字段要确保有值);
  • 如果还是没数据,先看控制台打印的员工数量,如果是0,说明当天确实没有员工生日,或者搜索条件仍需调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:28:27