第一章:字段和视图¶
在上一章中,我们学习了一系列的技能,包括如何创建和使用服务,与布局组件一起工作,使仪表板可翻译,并延迟加载像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);
有几个重要的事情需要注意:
The
CharField
receives its (raw) value in props. It needs to format it before displaying it.它在其props中接收一个
update
函数,该函数由字段用于通知状态所有者该字段的值已更改。请注意,字段不会(也不应该)维护其值的本地状态。每当更改已应用时,它将通过props的方式返回(可能在onchange之后)。它定义了一个
extractProps
函数。这是一个将通用标准属性转换为视图特定专用属性的步骤,这些属性对组件非常有用。这使得组件具有更好的 API,并且可能使其可重用。
字段必须在 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
创建一个继承自
BooleanField
的新LateOrderBoolean
字段。LateOrderBoolean
的模板也可以从BooleanField
模板中 继承 。在列表/看板/表单视图中使用它。
修改它以在旁边添加一个红色的
Late
,如所请求的。
4. 针对某些客户的消息¶
Odoo表单视图支持 widget
API,它类似于字段,但更通用。它可用于在表单视图中插入任意组件。让我们看看如何使用它。
Exercise
为了实现超高效的工作流程,我们希望根据一些条件显示具体信息的警告块:
如果
image_url
字段未设置,则应显示“无图像”。如果订单的
amount
高于100欧元,则应显示“添加促销材料”。确保您的小部件实时更新。
小技巧
尝试在浏览器的开发工具的 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
修改前面的练习,将
image
和material
这两个词加粗。警告应该被标记,并且模板应该被修改以使用
t-out
。从Owl中导入
markup
函数,并且对于每个消息,将其替换为使用该函数并将消息作为参数传递的调用。
注解
这是一个对 t-out
的安全使用示例,因为字符串是静态的。
7. 自动重新加载看板视图¶
Bafien很沮丧:他想在外部显示器上看到t恤订单的看板视图,但视图需要保持最新。他厌倦了每30秒点击 刷新 图标,所以他委托你找到一种自动完成的方法。
就像之前的练习一样,这种定制需要创建一个新的JavaScript视图。
Exercise
扩展看板视图/控制器,使其每分钟重新加载数据。
在视图注册表中注册它,位于
awesome_tshirt.autoreloadkanban
。在看板视图的arch中使用它(使用
js_class
属性)。
重要
如果您使用 setInterval
或类似的东西,请确保在组件卸载时正确取消它。否则,您将引入内存泄漏。