用途:该技能面向 Frappe 框架 Document Controller 的调试与错误预防,按文档生命周期阶段定位问题:命名(autoname / before_naming)、校验(before_validate / validate / before_save)、保存(before_save / on_update / after_insert)、提交(before_submit / on_submit)、取消(before_cancel / on_cancel)以及权限(has_permission / get_list)。资料以错误信息、成因、修复三列表格和代码正反例呈现常见故障。
主要能力:可诊断 NamingSeries 未设置、DuplicateEntryError、Maximum recursion depth exceeded、Not allowed to submit、Cannot cancel: linked docs exist、AttributeError: super()、frappe.db.commit() 破坏事务、on_update 中变更丢失、NestedSet 根节点循环引用、extend_doctype_class 冲突与 has_permission 返回值异常、permission_query_conditions SQL 错误等。
关键规则:override 时始终调用 super().method();在 before_submit 而非 on_submit 做阻断校验;on_update 使用 self.db_set();用 self.flags 防递归;on_cancel 隔离各清理操作;权限查询用 frappe.db.escape() 防注入;has_permission 显式返回 True/False;不要吞异常,使用 frappe.log_error();用户可见信息用 _() 包裹。禁止在 validate/on_update 调用 self.save(),禁止在 controller 中调用 frappe.db.commit(),禁止在 on_submit 放阻断校验,禁止在 override 中跳过 super(),禁止 has_permission 返回 None。
使用方式与参考文件:包含 references/examples.md(真实控制器错误场景与诊断)、references/anti-patterns.md(常见错误与修复)、references/patterns.md(按生命周期钩子的防御性错误处理模式)。v16+ 推荐用 extend_doctype_class 替代 override_doctype_class。
限制:资料未提供适用范围版本下限、性能指标、收费信息或安装步骤。