提问人:Slavi 提问时间:11/8/2023 最后编辑:Slavi 更新时间:11/13/2023 访问量:40
电子邮件模板中的 Odoo 15 Qweb Foreach
Odoo 15 Qweb Foreach in Email Template
问:
当一个函数被执行时,我正在浏览一个记录列表,该列表存储在一个变量中,然后转换为字典,最后将其发送到电子邮件模板,并希望它生成带有一个的表,以便它可以构造每一行。但我被困在最后一部分t-foreach
def sh_mass_approved_timesheet(self):
timesheet_details = []
for timesheet in self:
timesheet.sh_approved_by = self.env.user.id
timesheet.sh_approved_date = fields.Datetime.now()
timesheet.state = 'approved'
timesheet_details.append({
'date': timesheet.date,
'description': timesheet.name,
'project': timesheet.timecodes_id.name,
'duration': timesheet.unit_amount,
})
# Pass as template context
email_body = {
'timesheet_details': timesheet_details,
}
# Send one email compiling the approved timesheets
template = self.env.ref('sh_timesheet_approval.sh_approve_timesheet_template', raise_if_not_found=False)
if template:
template.sudo().send_mail(self.ids[0], force_send=True, email_body=email_body)
这是模板 XML
<table border="1" style="font-family: arial, sans-serif; border-collapse: collapse; width: 100%;">
<tr>
<th style="border: 1px solid #dddddd; text-align: left; padding: 8px;"><b>Date</b></th>
<th style="border: 1px solid #dddddd; text-align: left; padding: 8px;"><b>Description</b></th>
<th style="border: 1px solid #dddddd; text-align: left; padding: 8px;"><b>Project</b></th>
<th style="border: 1px solid #dddddd; text-align: left; padding: 8px;"><b>Duration</b></th>
</tr>
<t t-foreach="timesheet_details" t-as="line">
<tr>
<td><t t-esc="line.date"/></td>
<td><t t-esc="line.description"/></td>
<td><t t-esc="line.project"/></td>
<td><t t-esc="line.duration"/></td>
</tr>
</t>
</table>
当我运行应用程序时,我收到以下错误: ValueError:<类 'ValueError'>:“模型'mail.mail'上的字段'timesheet_details'无效”,计算时 “记录.sh_mass_approved_timesheet()”
它引用了模板未访问列表,对于记录,变量“timesheet_details”和“email_body”的日志返回正确的数据,因此将数据传递给模板是问题所在。谢谢
我确实尝试了另一种方式来发送通过字典的数据,但即使它没有收到错误,电子邮件本身也会显示表格为空。
template.sudo().with_context(email_body).send_mail(self.ids[0], force_send=True)
答:
0赞
agengha
11/13/2023
#1
我假设邮件模型“mail.mail”是邮件应用程序的odoo默认模型。
你只显示xml文件的一部分,而不是全部,所以我没有办法知道你为模板使用了什么其他模型,但假设你只使用邮件模型,你应该做的是制作新的模型继承邮件应用程序的odoo默认模型,并添加timesheet_details作为one2many字段,计算字段或其他你认为合适的方法。
简而言之,odoo不会识别您的timesheet_detail,除非您在邮件模型中将其声明为字段。
评论
template = self.env.ref('sh_timesheet_approval.sh_approve_timesheet_template'