电子邮件模板中的 Odoo 15 Qweb Foreach

Odoo 15 Qweb Foreach in Email Template

提问人:Slavi 提问时间:11/8/2023 最后编辑:Slavi 更新时间:11/13/2023 访问量:40

问:

当一个函数被执行时,我正在浏览一个记录列表,该列表存储在一个变量中,然后转换为字典,最后将其发送到电子邮件模板,并希望它生成带有一个的表,以便它可以构造每一行。但我被困在最后一部分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)
python xml 模板 odoo-15

评论

0赞 Hermann12 11/8/2023
我没有看到您的代码与您的 xml 模板有任何联系?将值插入到 xml 的什么位置?
0赞 Slavi 11/9/2023
当然!。我发布的模板是完整模板的一部分,但模板的名称在 python 的这部分中声明: .在此之后,我们使用 send_mail() 将上下文传递给模板。template = self.env.ref('sh_timesheet_approval.sh_approve_timesheet_template'
0赞 sylvain 11/13/2023
如何使用 t-foreach=“email_body['timesheet_details']” ?

答:

0赞 agengha 11/13/2023 #1

我假设邮件模型“mail.mail”邮件应用程序的odoo默认模型。

你只显示xml文件的一部分,而不是全部,所以我没有办法知道你为模板使用了什么其他模型,但假设你只使用邮件模型,你应该做的是制作新的模型继承邮件应用程序的odoo默认模型,并添加timesheet_details作为one2many字段计算字段或其他你认为合适的方法。

简而言之,odoo不会识别您的timesheet_detail,除非您在邮件模型中将其声明为字段