用途:在自定义 Frappe 应用中用完整 Python 编写服务端 DocType 逻辑,适用于需要导入模块与外部库、try/except 回滚、frappe.enqueue() 后台任务或扩展标准 ERPNext DocType 的场景;无需自定义应用的原型验证可用 Server Script。
主要能力:控制器文件位于 apps/myapp/myapp/{module}/doctype/{doctype_name}/{doctype_name}.py,类名为 DocType 名去除空格(如 Sales Order → SalesOrder)。覆盖钩子执行顺序:INSERT 为 before_insert → before_naming → autoname → before_validate → validate → before_save → 入库 → after_insert → on_update → on_change;SAVE 与 SUBMIT/CANCEL 各有对应顺序。validate 在写库前执行且对 self 的修改会保存;on_update 在写库后执行,对 self 的修改不保存,需用 frappe.db.set_value 或 db_set。
使用方式:可收集多条错误后 frappe.throw("<br>".join(errors));用 self.flags 在钩子间传数据并用 get_doc_before_save() 检测字段变化;autoname 结合 getseries 生成命名,或用 before_naming 切换 naming_series。可提交文档状态流为 DRAFT(0)→SUBMITTED(1)→CANCELLED(2),validate 总在 before_submit 前运行,避免重复校验。覆盖 ERPNext 控制器可用 hooks.py 的 override_doctype_class(必须调用 super().validate())、doc_events 事件处理或 v16+ 的 extend_doctype_class。用 @frappe.whitelist() 暴露客户端可调用方法,通过 frm.call 调用。测试用 FrappeTestCase,命令为 bench run-tests --module myapp.module.doctype.my_doctype.test_my_doctype。
限制与注意事项:避免 on_update 中赋值与 save()、钩子内 frappe.db.commit()、validate 中重操作、循环内 frappe.get_doc()、硬编码阈值。资料未提供具体收费、价格与平台支持范围。