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. 额外检查点
- 确认报表模板ID
hr_birthdays.report_contributionregister_birthdays拼写完全正确; - 检查
age字段是否是hr.employee模型中存在的有效字段(计算字段要确保逻辑正确,存储字段要确保有值); - 如果还是没数据,先看控制台打印的员工数量,如果是0,说明当天确实没有员工生日,或者搜索条件仍需调整。
内容的提问来源于stack exchange,提问作者Prashanth K
相关产品推荐
相关产品推荐

