- 上传者: Administrator
- 上传时间:2023年12月05日 02时59分34秒
在上一章中,我们学习了一系列的技能,包括如何创建和使用服务,与布局组件一起工作,使仪表板可翻译,并延迟加载像Chart.js这样的JavaScript库。现在,让我们学习如何创建新的字段和视图。 本章节的每个练习的解决方案都托管在 官方Odoo教程存储库 [1] 上。 在尝试练习之前不建议查看解 ......
The
CharField
receives its (raw) value in props. It needs to format it before displaying it.它在其props中接收一个
update
函数,该函数由字段用于通知状态所有者该字段的值已更改。请注意,字段不会(也不应该)维护其值的本地状态。每当更改已应用时,它将通过props的方式返回(可能在onchange之后)。它定义了一个
extractProps
函数。这是一个将通用标准属性转换为视图特定专用属性的步骤,这些属性对组件非常有用。这使得组件具有更好的 API,并且可能使其可重用。创建一个继承自
BooleanField
的新LateOrderBoolean
字段。LateOrderBoolean
的模板也可以从BooleanField
模板中 继承 。在列表/看板/表单视图中使用它。
修改它以在旁边添加一个红色的
Late
,如所请求的。如果
image_url
字段未设置,则应显示“无图像”。如果订单的
amount
高于100欧元,则应显示“添加促销材料”。确保您的小部件实时更新。
修改前面的练习,将
image
和material
这两个词加粗。警告应该被标记,并且模板应该被修改以使用
t-out
。从Owl中导入
markup
函数,并且对于每个消息,将其替换为使用该函数并将消息作为参数传递的调用。扩展看板视图/控制器,使其每分钟重新加载数据。
在视图注册表中注册它,位于
awesome_tshirt.autoreloadkanban
。在看板视图的arch中使用它(使用
js_class
属性)。
在上一章中,我们学习了一系列的技能,包括如何创建和使用服务,与布局组件一起工作,使仪表板可翻译,并延迟加载像Chart.js这样的JavaScript库。现在,让我们学习如何创建新的字段和视图。
本章节的每个练习的解决方案都托管在 官方Odoo教程存储库 上。 在尝试练习之前不建议查看解决方案。
字段和视图是Odoo用户界面中最重要的概念之一。它们对许多重要的用户交互起着关键作用,因此应该完美地工作。在JavaScript框架的上下文中,字段是专门用于可视化/编辑给定记录的特定字段的组件。例如,(Python)模型可以定义一个字符字段,该字段将由字段组件 CharField
表示。
一个字段组件基本上只是在 fields
registry 中注册的组件。字段组件可以定义一些额外的静态键(元数据),例如 displayName
或 supportedTypes
,以及最重要的一个: extractProps
,它准备了 CharField
接收到的基本 props。
示例:一个简单的字段
让我们讨论一个简化的 CharField
实现。首先,这是模板:
<t t-name="web.CharField" owl="1">
<t t-if="props.readonly">
<span t-esc="formattedValue" />
</t>
<t t-else="">
<input
class="o_input"
t-att-type="props.isPassword ? 'password' : 'text'"
t-att-placeholder="props.placeholder"
t-on-change="updateValue"
/>
</t>
</t>
它具有只读模式和编辑模式,后者是带有一些属性的输入。现在,这是JavaScript代码:
export class CharField extends Component {
get formattedValue() {
return formatChar(this.props.value, { isPassword: this.props.isPassword });
}
updateValue(ev) {
let value = ev.target.value;
if (this.props.shouldTrim) {
value = value.trim();
}
this.props.update(value);
}
}
CharField.template = "web.CharField";
CharField.displayName = _lt("Text");
CharField.supportedTypes = ["char"];
CharField.extractProps = ({ attrs, field }) => {
return {
shouldTrim: field.trim && !archParseBoolean(attrs.password),
maxLength: field.size,
isPassword: archParseBoolean(attrs.password),
placeholder: attrs.placeholder,
};
};
registry.category("fields").add("char", CharField);
有几个重要的事情需要注意:
字段必须在 fields
注册表中注册。一旦完成,它们可以在某些视图中使用(即: form
, list
, kanban
),通过使用 widget
属性。
Example
<field name="preview_moves" widget="account_resequence_widget"/>
1. image_preview
字段
每个在网站上的新订单都会被创建为 awesome_tshirt.order
。这个模型有一个 image_url
字段(类型为 char
),目前只能以字符串的形式显示。我们希望能够在表单视图中看到图片本身。
Exercise
注解
可以通过继承 CharField
来解决这个练习,但是这个练习的目标是从头开始创建一个字段。

另请参阅
2. 改进 image_preview
字段
我们希望改进上一个任务的领域,以帮助员工识别需要采取某些行动的订单。
Exercise
如果订单中没有指定图像URL,则以红色显示警告“缺少T恤设计”。

3. 自定义字段组件
让我们看看如何使用继承来扩展现有组件。
有一个 is_late
字段,是只读的布尔字段,位于订单模型上。在列表/看板/视图上看到这个信息会很有用。然后,假设我们想在它被设置为 true
时,在旁边添加一个红色的词“Late!”。
Exercise

4. 针对某些客户的消息
Odoo表单视图支持 widget
API,它类似于字段,但更通用。它可用于在表单视图中插入任意组件。让我们看看如何使用它。
Exercise
为了实现超高效的工作流程,我们希望根据一些条件显示具体信息的警告块:
小技巧
尝试在浏览器的开发工具的 Console 选项卡中评估 props.record
。

5. 使用 markup
让我们看看如何在模板中显示原始HTML。`t-out`指令可以用于此目的。实际上,它通常像`t-esc`一样工作,除非数据已经明确地使用标记函数标记了<https://github.com/odoo/owl/blob/master/doc/reference/templates.md#outputting-data>`_。在这种情况下,它的值将被注入为HTML。
Exercise
注解
这是一个对 t-out
的安全使用示例,因为字符串是静态的。

7. 自动重新加载看板视图
Bafien很沮丧:他想在外部显示器上看到t恤订单的看板视图,但视图需要保持最新。他厌倦了每30秒点击 刷新 图标,所以他委托你找到一种自动完成的方法。
就像之前的练习一样,这种定制需要创建一个新的JavaScript视图。
Exercise
重要
如果您使用 setInterval
或类似的东西,请确保在组件卸载时正确取消它。否则,您将引入内存泄漏。
- 微信扫一扫,一分也是爱:
-
服务原则及地区范围
宜兴通达网络科技有限公司,地处中国宜兴环科园内,是一家高新技术企业。公司在企业网络维护和企业信息化建设与咨询方面,有10多年经验。
我公司愿与客户一道,力求彻底解决客户问题!
我们不是在给企业提供“头痛医头、脚痛医脚”的暂时解决方案,而是在部署根本性安全与稳定服务!!
我们愿携手客户,建立企业IT规划;杜绝随意安装系统、软件等操作;力求共同维护有序、安全、稳定的网络办公环境!!!
IT服务,服务是根本,客户是上帝;我们提供快速响应、快速上门、快速排查,提供优质高效的服务!!!!
通达科技提供全国范围内的服务,服务形式包括远程协助、电话咨询、电子邮件咨询、传真咨询、问答平台的问题解决等。
宜兴地区提供上门服务:
- 市区服务:宜城街道、城北街道(屺亭街道)、新街街道、新庄街道、环科园、渚桥开发区
- 市郊服务:张渚镇、西渚镇、太华镇、徐舍镇、官林镇、杨巷镇、新建镇、和桥镇、高塍镇、万石镇、周铁镇、芳桥镇、丁蜀镇、湖父镇。