Frappe框架上传SQLite文件解析后自动填充DocType表单问题咨询
问题1:上传文件填充表单的最优实现方案
你当前用客户端字段事件触发的思路是可行的,调整后可覆盖未保存草稿的场景,这也是Frappe生态下的标准实现逻辑:
- 前端监听附件字段的变更事件,仅传递附件的
file_url而非整个文档对象到后端,避免未保存文档无主键导致后端查询失败 - 后端仅负责文件解析、字段值提取逻辑,不提前执行文档保存操作,避免生成脏数据
- 后端解析完成后返回字段键值对给前端,由前端更新表单值,最终由用户手动触发保存,符合常规表单交互逻辑
问题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
相关产品推荐
相关产品推荐

