Odoo15中Nova Code Forms模块表单提交后PDF下载方案咨询
Odoo 15 + Nova Code Forms 模块集成与PDF下载解决方案
一、模块与Odoo的集成方式
Nova Code Forms是专为Odoo网站设计的表单构建模块,安装后自动和Odoo的网站模块、数据模型深度集成:
- 后台通过【网站】->【Forms】菜单管理表单,拖拽式创建字段,无需额外配置基础集成
- 用户提交的表单数据会自动存储到Odoo内置的
nova.form.submission模型中,每个提交记录关联对应的表单配置 - 模块自带前端渲染逻辑,表单提交采用AJAX异步请求,无需手动处理表单提交的基础流程
二、捕获表单提交的数据
1. 后台查看数据
直接在对应表单的【Submissions】标签页查看所有提交记录,每条记录包含用户填写的所有字段值。
2. 前端自定义捕获
利用模块提供的nova_form_success事件,在表单提交成功后获取提交ID和数据:
document.addEventListener('nova_form_success', function(event) { // event.detail包含提交ID、表单ID等关键信息 const submissionId = event.detail.submission_id; // 如果需要获取字段数据,可通过Odoo的RPC接口请求对应记录 odoo.env.services.rpc('/web/dataset/call_kw', { model: 'nova.form.submission', method: 'read', args: [[submissionId], ['field_name1', 'field_name2']], kwargs: {} }).then(data => { console.log('提交数据:', data[0]); }); });
3. 后端自定义处理
继承nova.form.submission模型,在创建提交记录时添加逻辑:
from odoo import models, api class NovaFormSubmission(models.Model): _inherit = 'nova.form.submission' @api.model def create(self, vals): submission = super().create(vals) # 这里可添加自定义逻辑,比如发送通知、同步数据到其他模块 return submission
三、生成带提交数据的PDF并下载
你之前的问题核心是用了静态PDF文件,无法填充用户数据,正确做法是用Odoo的QWeb报表引擎动态生成PDF:
1. 创建QWeb报表模板
在自定义模块中创建关联nova.form.submission模型的报表模板(示例见下文「PDF模板制作」部分)
2. 前端触发PDF下载
在表单提交成功的回调中,请求Odoo的报表路由生成并下载PDF:
document.addEventListener('nova_form_success', function(event) { const submissionId = event.detail.submission_id; // 替换成你创建的报表XML ID,格式为`模块名.报表ID` const reportUrl = `/report/pdf/your_module.nova_form_submission_report/${submissionId}`; // 创建临时a标签触发下载 const downloadLink = document.createElement('a'); downloadLink.href = reportUrl; downloadLink.download = `我的提交表单_${submissionId}.pdf`; document.body.appendChild(downloadLink); downloadLink.click(); document.body.removeChild(downloadLink); });
四、制作符合要求的PDF模板
用QWeb模板实现双列页眉、页脚和数据填充,以下是核心代码示例:
<odoo> <!-- 注册报表 --> <report id="nova_form_submission_report" string="表单提交凭证" model="nova.form.submission" report_type="qweb-pdf" name="your_module.form_submission_pdf" file="your_module.form_submission_pdf" attachment_use="False"/> <!-- PDF模板内容 --> <template id="form_submission_pdf"> <t t-call="web.html_container"> <t t-foreach="docs" t-as="o"> <div class="page" style="width:210mm; height:297mm; padding:20mm;"> <!-- 双列页眉 --> <div style="display:flex; justify-content:space-between; border-bottom:1px solid #333; padding-bottom:10mm; margin-bottom:15mm;"> <div> <img src="/your_module/static/src/img/company_logo.png" style="width:150px;"/> <p style="margin-top:5mm;">公司地址:XX省XX市XX区XX路XX号</p> <p>联系电话:XXX-XXXXXXX</p> </div> <div> <!-- 二维码:可基于提交ID生成,或存储在模型中 --> <img t-att-src="`https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=表单提交ID:${o.id}`" style="width:120px; height:120px;"/> </div> </div> <!-- 用户提交数据区域 --> <div style="margin-bottom:30mm;"> <h2 style="text-align:center; margin-bottom:10mm;">表单提交凭证</h2> <table style="width:100%; border-collapse:collapse;"> <tr> <td style="width:30%; padding:5mm; border:1px solid #ddd;">姓名</td> <td style="width:70%; padding:5mm; border:1px solid #ddd;"><t t-esc="o.field_name"/></td> </tr> <tr> <td style="padding:5mm; border:1px solid #ddd;">邮箱</td> <td style="padding:5mm; border:1px solid #ddd;"><t t-esc="o.field_email"/></td> </tr> <!-- 其他字段按此格式添加 --> </table> </div> <!-- 双列页脚 --> <div style="display:flex; justify-content:space-between; border-top:1px solid #333; padding-top:10mm;"> <div style="text-align:center;"> <p>地方官员签名</p> <div style="border-bottom:1px solid #333; width:250px; margin:5mm auto;"></div> <p>日期:___________</p> </div> <div style="text-align:center;"> <p>验证盖章处</p> <div style="border:1px solid #333; width:180px; height:120px; margin:5mm auto;"></div> </div> </div> </div> </t> </t> </template> </odoo>
五、原有代码问题分析
- 静态PDF无法填充数据:你链接的是预先生成的空白PDF,没有和用户提交的数据关联,自然无法显示内容
- 表单提交失败:
<a>标签的下载行为会中断AJAX表单请求,导致表单提交被取消。正确流程是先完成表单提交,再触发PDF下载,而不是同时执行两个操作
内容的提问来源于stack exchange,提问作者Böychilď
相关产品推荐
相关产品推荐

