只读字段是Odoo中的一种功能,乍一看似乎很简单,但实际上比大多数用户预期的要重要得多。
无论您是一个想知道为什么某些字段是灰色的业务用户,还是一个希望控制Odoo自定义中字段行为的开发者,本指南涵盖了您需要了解的所有内容。
理解只读字段的工作原理是构建可靠工作流程、保护数据完整性以及为您的团队提供更顺畅体验的关键。
本Odoo字段教程涵盖了只读字段的业务和技术两方面,因此无论您是在配置Odoo还是在其基础上构建,您都能在这里找到所需的信息。
Odoo中的只读字段是什么
Odoo中的只读字段是一个显示值但用户无法通过界面直接编辑的字段。数据是可见的,但输入是锁定的。
在表单视图中,只读字段通常以普通文本的形式出现,而不是交互式输入框。根据Odoo主题的不同,它们可能看起来稍微灰暗或与可编辑字段相比显得平坦。
在Odoo数据模型中,只读行为可以在两个不同的层次上应用:
- 在字段层级(Python/ORM):该字段在所有视图和上下文中始终为只读
- 在视图层级(XML):该字段在特定视图或特定条件下为只读
这种区别很重要。在ORM层级标记为只读的字段无法通过任何用户界面进行编辑。在视图层级标记为只读的字段在特定上下文中受到保护,但在其他视图或通过服务器端代码仍然可以写入。
只读本身不是一种字段类型。它是可以应用于任何标准Odoo字段类型的属性:Char、Integer、Float、Many2one、Date等。这是Odoo框架控制字段在运行时行为的核心部分。
只读字段是如何工作的
要理解只读字段的行为,查看Odoo ORM(Python)和视图层(XML)两方面是有帮助的。
ORM层级的只读
在Odoo ORM中,可以直接在Python模型中声明一个字段为永久只读。这在计算字段中最为常见,因为它们的值来自其他数据。字段定义中包括readonly=True作为参数,Odoo将永远不允许用户通过UI编辑它。
这一层次的只读是Odoo Python字段API的一部分,并在官方Odoo开发者指南中有文档说明。它在全球范围内适用,无论使用哪个视图。
基于状态的只读
在Odoo开发中,最常见的模式之一是根据文档的当前状态使字段只读。这就是标准模块如销售、采购和会计在文档超过草稿阶段后锁定其数据的方式。
在 Odoo 16 及更早版本中,这是通过在视图 XML 中使用 attrs 属性来完成的,将域条件与字段元素结合起来。在 Odoo 17 及更高版本中,语法更加简洁,直接作为内联表达式写在字段元素上。
这两种方法实现了相同的结果:在文档处于草稿状态时,字段是可编辑的,一旦通过工作流进展,就会被锁定。这是任何涵盖字段配置的 Odoo 技术教程中的基本概念。
计算字段和只读
Odoo 计算字段默认是只读的。当您定义一个带有 compute 方法的字段时,Odoo 假设它不应该被直接编辑,因为它的值是自动从其他字段派生的。
如果您希望计算字段也被存储,您需要同时设置 compute 参数和 store=True。这些存储的 Odoo 数据库字段是性能优化的常见模式,因为它们可以在搜索过滤器中使用,并且在数据库级别高效排序,而无需实时重新计算值。
使计算字段可写
如果您需要计算字段也接受手动输入,您可以定义一个反向方法与之一起使用。反向方法告诉 Odoo 当用户向计算字段写入值时该怎么做。如果没有反向方法,字段默认保持只读。这是更高级的 Odoo ORM 字段类型 API 的一部分,并在 Odoo 开发者指南中深入介绍。
业务用例
只读字段出现在每个 Odoo 模块中。以下是来自真实业务工作流的五个实际示例。
1. CRM:锁定赢得和失去机会的数据
在 CRM 模块中,预期收入和关闭日期在处理潜在客户时是可编辑的。一旦机会被标记为赢得或失去,这些字段就会被设置为只读,以保持准确的关闭记录和关闭价值。
这防止任何人在事后回去调整数字,这会扭曲销售报告和管道分析。
2. 销售:保护确认的订单行
当销售订单从草稿状态变为确认状态时,订单行变为只读。客户收到确认后,用户无法再更改产品、数量或价格。
如果确实需要更改,订单必须明确重置为草稿,这会创建审计记录,并使更正变为有意而非无意。
3. 库存:验证的库存移动数量
在仓库操作中,一旦交付或收货被验证,完成的数量就会被锁定。这保护了库存估值的完整性,并确保记录与实际在仓库中移动的物品相匹配。
验证后的可编辑数量可能会悄悄破坏多个地点的库存水平。
4. 会计:已发布的分录行
在会计中,一旦分录被发布,所有行变为只读。这在许多国家是法律要求,也是复式记账的核心原则。
在发布后允许编辑将损害财务报表的可靠性,并造成严重的合规风险。
5. 制造:已完成的工作订单数据
在制造模块中,一旦工作订单标记为完成,实际持续时间和生产数量将设置为只读。这保留了准确的生产记录,以便进行成本分析和绩效跟踪。
创建或自定义只读字段
在Odoo中配置只读字段有两种主要路径:使用Odoo Studio进行无代码方法,或直接编写Python和XML以获得完全的技术控制。
使用Odoo Studio
Odoo Studio 字段使得添加或修改只读行为变得简单,无需编写任何代码。要使用 Studio 将字段配置为只读:
- 从主菜单(铅笔图标)打开 Odoo Studio
- 导航到您想要配置字段的表单视图
- 点击您想要修改的字段
- 在右侧属性面板中,切换 "只读" 选项
- 保存并关闭 Studio
Studio 还允许您使用域表达式设置 条件只读 行为。例如,您可以使字段在状态字段等于特定值时才为只读,而无需编写一行代码。
Odoo Studio 的创建字段方法是顾问和管理员快速安全地执行数据规则的正确选择。通过 Studio 进行的更改存储在数据库中,并且不会被模块升级覆盖。
使用 Python 进行技术定制
对于构建自定义 Odoo 模块的开发人员,readonly 属性直接在 Python 模型中的字段定义上设置。这是标准的 Odoo Python 字段用法,并在每本 Odoo 开发者指南中都有涉及。
您可以将 readonly=True 作为静态参数设置在任何字段类型上,使其永久不可编辑。为了更灵活的控制,states 参数允许您定义字段在文档的哪些状态下应可写与只读。
这种方法在您作为 Odoo 定制项目的一部分向现有 Odoo 模型添加自定义字段时特别有用。它将字段逻辑与数据模型紧密结合,而不是分散在多个视图文件中。
使用 XML 视图属性
对于视图级只读行为,您可以直接在视图 XML 中的字段元素上添加 readonly 属性。这是 Odoo 开发工作流程中任何技术自定义的一部分。
视图级只读的优势在于灵活性:同一个字段可以在不同的视图或不同的条件下表现不同,而无需更改底层字段定义。当您需要对现有标准字段添加限制而不修改其 Python 定义时,这通常是首选的方法。
在 Odoo 17 中,针对只读条件的内联表达式语法比早期版本中使用的 attrs 字典语法更简洁、更易读。根据您使用的 Odoo 版本,这两种方法都是有效的。
最佳实践
有效使用只读字段归结为在正确的级别、出于正确的原因应用它们。以下是从 Odoo 咨询的角度来看最重要的指导原则。
1. 当上下文变化时,优先选择视图级只读
如果一个字段仅在某些文档状态或特定视图中需要为只读,则应在视图级别而非模型级别应用只读。这保持了您的 Odoo 数据模型的灵活性,并允许后端流程或 API 集成在需要时仍然可以写入该字段。
2. 使只读条件与文档生命周期对齐
您的只读条件应与文档的自然流动相匹配。当文档达到一个状态时,进一步编辑可能会导致问题,此时字段应被锁定。这为用户创造了可预测且直观的体验,这是成功实施 Odoo 自定义的标志之一。
3. 跨用户角色进行测试
只读行为可能会以意想不到的方式与访问权限交互。始终以标准用户和管理员的身份测试您的配置,以验证该字段对每个角色的行为是否正确。对一个用户组来说看似只读的字段,可能对另一个用户组仍然是可编辑的,这取决于他们的角色。
4. 在合适的情况下将只读与必填结合使用
在多阶段表单中,一个字段在草稿状态下可能是必填的,但在后续状态中是只读的。您可以在视图 XML 中结合这两个属性,以干净地强制执行这种模式。这在像交付日期或参考编号这样的字段中很常见,这些字段必须在文档确认之前填写。
5. 记录您的只读逻辑
在自定义 Odoo 开发中,特别是在复杂数据模型上,始终添加注释以解释为什么一个字段是只读的。未来维护代码的开发人员需要理解限制背后的业务原因,而不仅仅是技术实现。
6. 使用 Studio 字段进行快速、升级安全的更改
对于简单的用例,Odoo Studio 字段提供了一种快速且升级安全的方式来添加只读行为。将 Python 自定义保留给 Studio 无法提供所需逻辑的情况,例如复杂的跨字段条件或与自定义计算字段的集成。
常见陷阱
即使是经验丰富的 Odoo 用户和开发人员也会遇到相同的只读字段问题。在它们让您感到意外之前,这里有一些值得了解的内容。
将视图级只读与安全边界混淆
在视图中设置为只读的字段并不会阻止通过 XML-RPC API、Python 中的 ORM 写入调用或服务器操作进行更新。视图级只读是一种 UI 限制,而不是安全控制。如果您确实需要防止对字段的所有写入,您需要在 ORM 级别或通过访问控制规则来强制执行,而不仅仅是在视图中。
在条件更好时使字段永久只读
当您想保护一个字段时,完全锁定它是很诱人的。但是,如果用户在某些情况下确实需要编辑它,例如在将文档重置为草稿时,永久的 ORM 级只读将完全阻止他们,包括任何纠正工作流程。在选择永久性而非条件性之前,始终考虑完整的生命周期。
忘记 onchange 方法
如果一个只读字段也在 onchange 方法中被引用,该方法仍然可以尝试为其分配一个值。这可能会产生混淆的行为,即字段在用户交互期间似乎更新,但随后又恢复或触发错误。确保您的 onchange 逻辑考虑到只读字段。
未在所有视图中一致地应用只读
在表单视图中标记为只读的字段,如果列表视图或看板视图没有包含相同的限制,可能仍然是可编辑的。始终检查您的只读配置是否在字段出现的每个视图中一致应用。
继承标准模型时的副作用
当从标准 Odoo 模型继承并向现有字段添加 readonly=True 时,此更改会影响所有显示该字段的视图,包括标准视图。确保这是有意为之,并且不会破坏标准 Odoo 行为或与同一模型上的其他自定义冲突。
结论
只读字段是 Odoo 中引导用户通过工作流程、保护数据完整性和执行业务规则的基本工具,而不仅仅依赖培训。
关键在于知道何时在视图级别与模型级别应用只读,并确保条件与您的团队实际工作方式一致。一个配置良好的 Odoo 数据模型总是在文档生命周期的正确时刻深思熟虑地使用只读字段。
无论您是通过 Odoo Studio 以无代码方式配置它们,还是作为更广泛 Odoo 开发项目的一部分直接在 Python 和 XML 中定义它们,只读字段背后的逻辑始终是一致的:展示数据,但保护其免受意外更改。
它们可能不是 Odoo 自定义中最常讨论的话题,但它们悄然成为影响最大的主题之一。
在 Dasolo,我们帮助公司在所有模块和行业中实施、定制和优化 Odoo。如果您需要帮助配置字段、设计可靠的工作流程或改善您的 Odoo 数据模型,我们的团队随时准备支持您。 与我们联系 并告诉我们您的项目。