一、概述
自定义字段(Custom Field)是 Frappe/ERPNext 中一个重要的功能,允许我们在不修改原始 DocType 的情况下添加新的字段
二、创建自定义字段的方法
- 通过 Web 界面创建
路径: Setup → Customize → Custom Field
优点:直观,可以立即看到效果
缺点:无法版本控制,迁移时需要手动操作 - 通过代码创建(推荐)
# custom_fields.py def setup_custom_fields(): custom_fields = { "Sales Order": [ { "label": "Test Field 1", "fieldname": "test_custom_field1", "fieldtype": "Data", "insert_after": "title", "translatable": 0 } ] } create_custom_fields(custom_fields)
三、自定义字段配置说明
- 必填参数
参数 | 说明 |
fieldname | 字段名称,建议以 custom_ 开头 |
label | 显示的标签 |
fieldtype | 字段类型(Data/Link/Select等) |
insert_after | 插入位置 |
- 可选参数
参数 | 说明 |
translatable | 是否可翻译(0或1) |
reqd | 是否必填 |
in_list_view | 是否在列表视图显示 |
in_standard_filter | 是否作为标准筛选条件 |
allow_on_submit | 是否允许在提交后修改 |
四、自定义字段的持久化
- 配置 fixtures
# hooks.py fixtures = [ { "dt": "Custom Field", "filters": [ ["dt", "in", ["Sales Order", "Work Order"]], ["fieldname", "in", ["test_custom_field1", "test_custom_field2"]] ] } ]
- 配置安装钩子
# hooks.py after_install = "testcustomfield.custom_fields.setup_custom_fields"
五、重要说明
- 字段持久性
自定义字段会保存在数据库的 tabCustom Field 表中
卸载应用时默认不会删除这些字段
升级 Frappe/ERPNext 不会影响自定义字段 - 最佳实践
使用统一的命名规范(如 custom_ 前缀)
通过代码管理自定义字段
使用 fixtures 确保配置可迁移
保持字段命名的唯一性
六、常用操作
- 导出自定义字段
bench --site your-site export-fixtures
- 安装应用时创建字段
bench --site your-site install-app your-app
3. 检查字段是否存在
frappe.get_meta("Sales Order").get_field("test_custom_field1")
4. 手动删除字段
frappe.delete_doc("Custom Field", "Sales Order-test_custom_field1")
七、注意事项
- 安全性
添加字段前确认字段名不与现有字段冲突
谨慎删除生产环境中的自定义字段 - 性能
避免添加过多不必要的自定义字段
合理使用字段类型,避免过度使用复杂字段类型 - 维护
保持文档更新
定期检查和清理未使用的自定义字段
在测试环境验证后再部署到生产环境
八、故障排除
- 字段未显示
清除缓存:bench clear-cache
重建前端资源:bench build
重启服务:bench restart - 字段无法删除
检查字段依赖关系
确认字段未被其他文档引用 - 迁移问题
确保 fixtures 配置正确
检查字段命名是否规范
验证过滤器是否正确设置
Frappe/ERPNext 自定义字段迁移指南