在开发odoo模型时,我们定义的字段是用于生成数据库表的字段,所以模型定义的类型基本上与数据表的字段类型一致,然后odoo通过定义的widget来将字段依某种风格显示在页面视图中。如果我们要改变默认的字段显示风格,可以在xml中,通过widget属性来指定另外的显示风格。今天我们就来整理一下,不同的模型定义字段,有哪些可以切换的其它小部件显示(这些只是常用的,并不是全部)。
fields.Integer:默认显示为一个text类型的文本框,如果想在输入框右边显示上下箭头,来实现自动累加/累减,可以通过如下方式修改:
<field name="int_value" options='{"type": "number"}'/>
复制
默认的步长数是1,如果想定义步长,也可以通过如下方式来修改:
<field name="int_value" options='{"type": "number", "step": 100}'/>
复制
如果这个Integer字段是一个进度显示,我们可以使用如下的小部件来展示一个进度条:
<field name="absence_of_today" widget="progressbar"
options="{'current_value': 'absence_of_today', 'max_value': 'total_employee', 'editable': false}"/>
复制
另外Integer类型可以通过指定部件handle,来实现将记录上下拖动改变位置。
fields.Float:默认显示一个浮点数字输入框,上面Integer的属性options也可以在这里使用,而且还多了一个属性,用于限制数字的整数/小数位的长度,如:
<field name="factor" digits="[42,5]"/>
复制
这个模型字段还有几种不同的显示风格部件:
monetary:该小部件是正确显示一个带货币的金额显示。在参数中需要指定货币类型字段,如:
<field name="value" widget="monetary" options="{'currency_field': 'currency_id'}"/>
复制
float_time:该小部件的目标是正确显示一个表示时间间隔(以小时为单位)的浮点值。
例如,将0.5设置为0:30格式,或将4.75设置为4:45,如:
<field name="worked_hours" string="Work Hours" widget="float_time"/>
复制
float_factor:该小部件显示使用其选项中给定的因子转换的浮点值。例如,保存在数据库中的值为0.5,因子为100,小部件的值应设置为50,如:
<field name="qty" widget="float_factor" options='{"factor":100}'/>
复制
float_toggle:该小部件用包含一系列可能值的按钮替换输入字段。每次单击都允许用户在范围内循环。此处的目的是将字段值限制为预定义的选择,如:
<field name="days_close" widget="float_toggle" options='{"range": [0, 4, 8]}'/>
复制
fields.Date:默认显示一个下拉日历控件输入,因为odoo中的日历控件是使用的datepicker插件,所以一些datepicker的属性也可以在这里使用,如要限制每周的第一天和最后一天不允许选择,可以用这个语法:
<field name="datefield" options='{"datepicker": {"daysOfWeekDisabled": [0, 6]}}'/>
复制
日期字段还有一个小部件,是用于选择一下日期范围的,部件名称是daterange,我们来看一下这个实例:
<field name="start_date" widget="daterange" options='{"related_end_date": "end_date"}'/>
复制
这里通过widget="daterange"来指明显示一个日期范围选择的控件,然后通过参数related_end_date,指明把截止的日期写入字段end_date。我们还可以通过参数picker_options来扩展其它的datepicker控件的其它参数。
fields.Datetime:这个字段的小部件使用规则与前一个fields.Date相同。
fields.Char:该字段用于显示一个文本类型的输入框,为显示不同的文本风格,我们有如下几种小部件可以使用:
email:将文本内容以email地址的格式显示,在只读状态可以生成一个mailto的链接;
phone:将文本内容以电话号码的格式显示,在手机浏览模式,点此文本可以调用电话拨出功能;
url:将文本内容显示为一个域名地址,在只读状态要以点击打开一个页面;
domain:将文本内容显示为一个domain格式的输入;
link_button:将文本内容显示为一个按钮风格的URL链接。
fields.Binary:该字段存放一个二进制流文件内容,一般用于存放图片或文档。如果字段数据流是一个图片,则可以用小部件image来指定显示风格,如:
<field name="image" widget='image' options='{"preview_image":"image_128"}'/>
复制
其中的参数preview_image是指定另外一个字段名称,表示当前图片的一个预览图。
另外如果这个二进制流字段是一个文档,我们可以通过如下方法来指定文档的文件名存取字段,如:
<field name="datas" filename="datas_fname"/>
复制
fields.Selection:该字段用于固定值列表的录入,通常是显示为一个下拉风格,它也有一个增强的小部件priority,这将显示一组星形,用户单击星形数量来确认不同的值。这对于将任务标记为高优先级很有用。
<field name="priority" widget="priority"/>
复制
另外,如果针对selection字段,想在不同的选项下显示不同的颜色值,也可以通过如下的小部件来实现:
<field name="state" widget="label_selection" options="{
'classes': {'draft': 'default', 'cancel': 'default', 'none': 'danger'}
}"/>
复制
fields.Many2one:这是一个多对一的关联字段,正常情况下会显示主表的name字段名称,有一种比较特殊的情况,如果在自己的模型中,关联的是一个附件的id,而且这个附件是一个图片,那可以通过如下的小部件,直接显示这个附件的图片内容:
<field name="displayed_image_id" widget="attachment_image"/>
复制
odoo还有一些其它的可使用的小部件,但我们可能不是很常用,这里就没有一一介绍了,有兴趣的可以自己参考:https://www.odoo.com/documentation/13.0/reference/javascript_reference.html#non-relational-fields