Odoo开发在XML里定义记录

Posted by Ethan on 2019-08-20

使用表达式设置值

定义字段值的更精细的替代方法是eval属性。它评估一个Python表达式并将结果值分配给字段。
该表达式在除了Python内置函数之外还有一些在其他标识符的上下文中求值。
要处理日期,可以使用以下模块:time,datetime,timedelta和relativedelta。
例如,要将值设置为昨天,我们将使用:

1
2
<field name="date_deadline"
eval="(datetime.now() + timedelta(-1)).strftime('%Y-%m-%d')" />

我们以前使用过它来设置user_id的值:

1
<field name="user_id" eval="ref('base.group_user')" />

设置字段值的关系

知道如何使用eval属性和ref()函数在多对一关系字段(如user_id)上设置值。但是有一个更简单的方法。
<field>元素还有一个ref属性,用于使用外部标识符设置many2one字段的值。有了这个,我们可以设置user_id的值:

1
<field name="user_id" ref="base.user_demo" />

对于一对多和多对多字段,需要相关ID的列表,因此需要不同的语法;
Odoo提供了一种特殊的语法来写这种类型的字段。
以下示例取自Fleet官方应用程序,替换了tag_ids字段的相关记录列表:

1
2
3
4
5
6
<field name="tag_ids"  
eval="[(6,0,
[ref('vehicle_tag_leasing'),
ref('fleet.vehicle_tag_compact'),
ref('fleet.vehicle_tag_senior')]
)]" />

要在一对多字段上写,我们使用三元组列表。 每个三元组是一个写命令,根据所使用的代码执行不同的事情:

  • (0,_ ,{‘field’: value}) 创建一个新记录并将其链接到此记录
  • (1,id,{‘field’: value}) 更新已链接记录上的值
  • (2,id,_) 取消链接并删除相关记录
  • (3,id,_) 取消链接但不删除相关记录
  • (4,id,_) 链接已存在的记录
  • (5,,) 取消链接,但不会删除所有链接的记录
  • (6,_,[ids]) 使用提供的列表替换链接记录的列表
    前面列表中使用的下划线符号表示不相关的值,通常填充为0或False。

常用模型的快捷元素

在xml文件中除了<record>的元素,还有如<act_window><menuitem>元素。
作为参考,下列快捷元素可与他们加载数据的相应模型一起使用:
<act_window>是窗口操作模型,ir.actions.act_window
<menuitem>是菜单项模型,ir.ui.menu
<report>是报告行动模型,ir.actions.report.xml
<template>是存储在ir.ui.view模型的QWeb模板
<URL>是统一资源定位行为模型,ir.actions.act_URL