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

Frappe框架上传SQLite文件解析后自动填充DocType表单问题咨询

问题1:上传文件填充表单的最优实现方案

你当前用客户端字段事件触发的思路是可行的,调整后可覆盖未保存草稿的场景,这也是Frappe生态下的标准实现逻辑:

  1. 前端监听附件字段的变更事件,仅传递附件的file_url而非整个文档对象到后端,避免未保存文档无主键导致后端查询失败
  2. 后端仅负责文件解析、字段值提取逻辑,不提前执行文档保存操作,避免生成脏数据
  3. 后端解析完成后返回字段键值对给前端,由前端更新表单值,最终由用户手动触发保存,符合常规表单交互逻辑

问题2:获取上传附件的方法

Frappe有内置的附件获取能力,无需自己拼接文件路径:

  • 如果你已经拿到附件的file_url,直接通过以下代码获取File文档并读取内容:
import frappe

@frappe.whitelist()
def parse_file(file_url):
    # 拿到File文档对象
    file_doc = frappe.get_doc("File", {"file_url": file_url})
    # 直接读取文件二进制内容,用于SQLite解析
    file_content = file_doc.get_content()
    # 此处添加SQLite解析逻辑,提取需要的字段
    return {
        "custom_field1": "解析得到的值1",
        "custom_field2": "解析得到的值2"
    }
  • 如果你需要获取指定已保存文档的所有附件,可调用frappe.get_attached_files(doctype, docname)获取附件列表。

问题3:callback中刷新表单字段的方法

Frappe的frm.set_value支持直接传入字典批量更新字段,无需逐个赋值,且会自动触发字段关联的变更事件:

frappe.ui.form.on('CustomDT', {
    original_data: function(frm) {
        const file_url = frm.doc.original_data;
        if(file_url) {
            frappe.call({
                method: "customapp.customapp.doctype.customdt.customdt.parse_file",
                args: {
                    "file_url": file_url
                },
                callback: function(r) {
                    if(!r.exc && r.message) {
                        // 批量更新所有解析得到的字段,自动刷新表单显示
                        frm.set_value(r.message);
                        // 如需强制刷新整个表单可额外调用 frm.refresh()
                    }
                }
            });
        }
    }
});

内容的提问来源于stack exchange,提问作者Sundypha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:27:03