如何阻止Django自动翻译日期,实现多语言下日期格式统一
Django多语言站点统一日期格式解决方案
全局配置层面修改
你当前开启了USE_L10N = True,该配置会让Django自动调用当前语言对应的本地化日期格式,是触发问题的核心原因,可按需求二选一修改:
- 完全关闭日期本地化,全局统一格式:
直接修改settings.py配置即可,所有日期渲染、校验都会优先走你指定的固定格式:# 关闭本地化格式自动适配 USE_L10N = False # 按需自定义全局统一的日期、时间格式 DATE_FORMAT = 'Y-m-d' DATETIME_FORMAT = 'Y-m-d H:i:s' TIME_FORMAT = 'H:i:s' - 保留其他本地化能力,仅统一日期格式:
不需要关闭USE_L10N,新增配置指定自定义格式文件路径:
然后在项目根目录新建# settings.py新增配置,your_project_name替换为你实际的项目名 FORMAT_MODULE_PATH = 'your_project_name.formats'formats文件夹,对应每一种支持的语言新建子文件夹(en/fr/ar),每个子文件夹下新建formats.py,所有文件内都写入相同的日期格式配置即可:DATE_FORMAT = 'Y-m-d' DATETIME_FORMAT = 'Y-m-d H:i:s' TIME_FORMAT = 'H:i:s'
表单校验问题修复
如果不想修改全局配置,可单独给表单的日期字段关闭本地化、固定输入格式,强制校验规则不随语言切换变化:
from django import forms class YourDateForm(forms.Form): # 普通表单字段配置 publish_date = forms.DateField( localize=False, input_formats=['%Y-%m-%d'] # 格式和你前端传的格式对齐即可 ) # 模型表单同理,重写字段配置即可 class YourModelForm(forms.ModelForm): class Meta: model = YourModel fields = ['publish_date'] widgets = { 'publish_date': forms.DateInput(format='%Y-%m-%d') }
前端日期选择器适配
法语站点下选择器仍显示英文,是因为前端选择器的语言没有和Django站点语言联动,按以下步骤调整:
- 提前引入你所用日期选择器的所有多语言包
- 在模板中获取Django当前语言代码,初始化选择器时传入语言参数,同时固定输出格式和后端对齐:
<script> // 获取Django当前语言 const currentSiteLang = '{{ LANGUAGE_CODE }}' // 初始化日期选择器 $('.date-picker').datepicker({ language: currentSiteLang, format: 'yyyy-mm-dd', // 和后端统一格式保持一致 autoclose: true }) </script>
模板日期渲染注意事项
在模板中输出日期时,不要直接输出日期对象,要用date过滤器指定固定格式,避免自动本地化:
{# 错误写法,会自动按当前语言渲染格式 #} {{ publish_date }} {# 正确写法,强制按指定格式渲染 #} {{ publish_date|date:"Y-m-d" }}
内容的提问来源于stack exchange,提问作者nassim
相关产品推荐
相关产品推荐

