Odoo 15网站/门户datetime picker格式切换及绕过系统限制咨询
Odoo 15 中将 Datetime Picker 改为 24 小时制的实现方案
基础修改方法
在 Odoo 15 中可以将 datetime picker 从 12 小时制切换为 24 小时制,常见实现方式有两种:
通过系统语言区域配置
确保字段使用默认的datetimewidget,然后在 Odoo 后台进入「设置」-「用户与公司」-「用户」,修改目标用户的「语言」为支持 24 小时制的区域(如中文简体zh_CN、英式英语en_GB),系统会自动适配对应时间格式。前端自定义强制修改
如果需要无视系统语言强制统一为 24 小时制,可以通过自定义模块的 JavaScript 代码重写 datetime picker 的格式:odoo.define('custom_module.custom_datetime_picker', function(require) { 'use strict'; var DateTimePicker = require('web.DateTimePicker'); DateTimePicker.include({ init: function(parent, options) { this._super(parent, options); // 自定义24小时制格式,可根据需求调整日期部分 this.format = 'YYYY-MM-DD HH:mm'; }, }); return DateTimePicker; });将上述代码放入自定义模块的
static/src/js/目录下,并在模块的__manifest__.py中引入该 JS 文件。
针对 datetime-local 类型字段的绕过方案
原生 HTML5 的
datetime-local控件格式确实由浏览器/操作系统的区域设置决定,无法直接通过 Odoo 配置修改,但可以通过以下方式绕过限制:
替换为 Odoo 原生 datetime widget
在模型的字段定义中,将widget='datetime-local'修改为widget='datetime',这样就能使用 Odoo 自带的时间选择器,不受系统设置影响,再按照前面的方法配置 24 小时制即可。自定义控件替换原生 datetime-local
如果必须保留datetime-local字段类型,可以通过 JS 代码隐藏原生控件,替换为自定义的 24 小时制时间选择器:odoo.define('custom_module.replace_datetime_local', function(require) { 'use strict'; var fieldRegistry = require('web.field_registry'); var FieldDatetimeLocal = fieldRegistry.get('datetime-local'); FieldDatetimeLocal.include({ start: function() { this._super.apply(this, arguments); // 隐藏原生控件 const $nativeInput = this.$el.find('input[type="datetime-local"]'); $nativeInput.hide(); // 初始化自定义24小时制选择器(示例使用Odoo内置组件) var DateTimePicker = require('web.DateTimePicker'); var picker = new DateTimePicker(this, { format: 'YYYY-MM-DD HH:mm', value: this.value, }); picker.appendTo(this.$el); // 同步选择器值到原生字段 picker.on('datetime_changed', this, function(event) { $nativeInput.val(event.date.toISOString().slice(0, 16)); this._setValue(event.date); }); }, }); return FieldDatetimeLocal; });
内容的提问来源于stack exchange,提问作者Bilal Shehab
相关产品推荐
相关产品推荐

