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

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>

五、原有代码问题分析

  1. 静态PDF无法填充数据:你链接的是预先生成的空白PDF,没有和用户提交的数据关联,自然无法显示内容
  2. 表单提交失败:<a>标签的下载行为会中断AJAX表单请求,导致表单提交被取消。正确流程是先完成表单提交,再触发PDF下载,而不是同时执行两个操作

内容的提问来源于stack exchange,提问作者Böychilď

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:05:21