如何在Odoo 15 QWeb报表及应付支票表单中自定义日期格式
在Odoo 15中设置固定日期格式(不受系统语言/当前日期影响)
一、QWeb报表中的实现
在QWeb报表里,直接利用context_timestamp将业务数据中的日期字段转换为用户时区的datetime对象,再通过strftime指定固定格式即可,完全不受系统语言设置影响。
代码示例
假设你的应付支票模型中有一个业务日期字段check_date,在QWeb报表中这样写:
<!-- 替换o.check_date为你实际使用的日期字段 --> <span t-esc="context_timestamp(o.check_date).strftime('%m-%d-%Y')"/>
说明
context_timestamp(o.check_date):将Odoo存储的UTC日期时间转换为当前用户时区的datetime对象,避免时区偏移问题。strftime('%m-%d-%Y'):指定固定格式,这里是月-日-年,你可以根据需求修改格式字符串(比如%Y-%m-%d表示年-月-日)。- 不要使用
datetime.datetime.now(),直接替换为业务数据中的目标日期字段(如支票出票日、到期日等),满足“不使用当前实际日期”的要求。
二、应付支票表单视图中的实现
如果需要在表单视图中也显示固定格式的日期,有两种常用方式:
方式1:添加计算字段(推荐)
在应付支票模型中新增一个计算字段,返回格式化后的日期字符串,不受系统语言影响。
模型层代码
from datetime import datetime import pytz from odoo import models, fields, api class AccountCheckPrinting(models.Model): _inherit = 'account.check.printing' # 替换为你实际的应付支票模型 formatted_check_date = fields.Char(string='格式化支票日期', compute='_compute_formatted_check_date') @api.depends('check_date') def _compute_formatted_check_date(self): user_tz = pytz.timezone(self.env.user.tz) if self.env.user.tz else pytz.utc for rec in self: if rec.check_date: # 将UTC日期转换为用户时区后格式化 local_dt = rec.check_date.astimezone(user_tz) rec.formatted_check_date = local_dt.strftime('%m-%d-%Y') else: rec.formatted_check_date = ''
视图层配置
在应付支票的表单视图中,添加或替换字段显示:
<field name="formatted_check_date" readonly="1"/>
方式2:表单打印时的格式控制
如果只是打印表单时需要固定格式,直接沿用QWeb报表的处理方式即可,在打印模板中使用前面的QWeb代码。
注意事项
- 格式字符串支持多种占位符,比如
%d(两位日)、%m(两位月)、%Y(四位年)、%H(24小时制时)等,按需组合即可。 - 若需要显示中文月份/星期,不要依赖
strftime的本地化输出(会受系统语言影响),建议手动映射月份名称,比如通过字典转换:month_map = {1:'一月', 2:'二月', ..., 12:'十二月'} formatted_date = f"{month_map[local_dt.month]} {local_dt.day}日, {local_dt.year}年"
内容的提问来源于stack exchange,提问作者zzaren 009
相关产品推荐
相关产品推荐

