Odoo10中如何让Datetime字段默认仅显示时间组件
解决Odoo Datetime字段仅显示时间组件的问题
嘿,我之前做Odoo项目时刚好碰到过一模一样的需求,给你几个实用方案,你可以根据自己的业务场景选:
方案1:视图层快速设置显示格式(适合仅需展示优化的场景)
如果只是想在视图展示时只显示时间,不需要改动编辑弹窗的逻辑,可以直接在XML视图的字段定义里通过options指定时间格式:
<field name="hor_ini" options='{"format": "HH:mm:ss"}'/>
不过要注意:这个设置只是改变前端显示样式,编辑时还是会弹出完整的日期时间选择器,而且数据库里依然会存储完整的日期时间(新建记录时默认带当前日期)。
方案2:自定义Widget(彻底实现仅时间的显示与编辑)
如果想要编辑时也只让用户选择时间,自定义专属Widget是最优解,步骤如下:
- 在你的模块下创建JS文件(比如
static/src/js/custom_time_widget.js),继承Odoo原生的DatetimeWidget并修改逻辑:
odoo.define('your_module.custom_time_widget', function(require) { "use strict"; var DatetimeWidget = require('web.DatetimeWidget'); var fieldRegistry = require('web.field_registry'); var CustomTimeWidget = DatetimeWidget.extend({ // 重写格式化方法,只返回时间部分 _formatValue: function(value) { if (!value) return ""; const date = moment(value); return date.format("HH:mm:ss"); }, // 重写取值逻辑,保留原有日期仅替换时间 _getValue: function() { const timeStr = this.$input.val(); if (!timeStr) return this._value; const originalDate = moment(this._value); const [hours, minutes, seconds] = timeStr.split(':'); originalDate.set({ hour: parseInt(hours), minute: parseInt(minutes), second: parseInt(seconds) || 0 }); return originalDate.toISOString(); } }); fieldRegistry.add('custom_time', CustomTimeWidget); return CustomTimeWidget; });
- 在模块的
__manifest__.py里引入这个JS文件:
'assets': { 'web.assets_backend': [ 'your_module/static/src/js/custom_time_widget.js', ], },
- 最后在视图里使用这个自定义Widget:
<field name="hor_ini" widget="custom_time"/>
这样不管是展示还是编辑,都只会处理时间部分,日期会保留数据库里的原有值(新建记录默认用当前日期)。
方案3:改用Float字段存储时间(最省心的纯粹时间方案)
如果你的业务场景根本不需要存储日期,只是需要记录时间点,那可以直接把字段类型改成fields.Float,配合Odoo原生的time widget:
- 修改字段声明:
hor_ini = fields.Float(string="Start Time", required=True)
- 视图里使用原生widget:
<field name="hor_ini" widget="time"/>
这个方案最省心,原生支持时间选择器,存储的是浮点数(比如14.3代表14:18),完全不需要额外开发。
内容的提问来源于stack exchange,提问作者ayar
相关产品推荐
相关产品推荐

