如何启用Django的“DATETIME_FORMAT”?

16 投票
5 回答
16935 浏览
提问于 2025-04-15 12:17

在Django的管理界面中,DATETIME_FORMAT应该放在哪里才能影响日期和时间的显示呢?

关于DATETIME_FORMAT的说明在这份文档中提到:http://docs.djangoproject.com/en/1.0/ref/settings/

"The default formatting to use for datetime fields on
Django admin change-list pages -- and, possibly, by
other parts of the system."

更新1:尽管文档上有说明,DATETIME_FORMAT实际上是失效的(它的值被忽略了)。很多年前它是有效的,但从那以后,Django在这个功能上的实现就出现了问题。看起来Django社区还没能决定怎么修复这个问题(但我觉得他们应该把DATETIME_FORMAT从文档中删除,或者在文档中加个说明提到这个问题)。

我把这些代码放进了网站/项目的“settings.py”文件中(不是应用程序的),但似乎没有任何效果(重启开发服务器后):

DATETIME_FORMAT = 'Y-m-d H:i:sO'

DATE_FORMAT = 'Y-m-d'

举个例子,当使用Django管理界面时,显示的格式是“2009年6月29日,晚上7:30”。

Django的版本是1.0.2,Python的版本是2.6.2(64位)。平台:Windows XP 64位。

Stack Overflow上的一个问题Django Admin中的欧洲日期输入似乎是完全相反的问题(因此看起来有些矛盾)。

“settings.py”文件的完整路径是“D:\dproj\MSQall\website\GoogleCodeHost\settings.py”。我现在是这样启动开发服务器的(在Windows命令行窗口中):

cd D:\dproj\MSQall\website\GoogleCodeHost

set DJANGO_SETTINGS_MODULE=GoogleCodeHost.settings

python manage.py runserver 6800

没有任何变化。此外,这些内容确实是从“settings.py”文件中读取的:

DATABASE_NAME

INSTALLED_APPS

TEMPLATE_DIRS

MIDDLEWARE_CLASSES

使用“django-admin.py startproject XYZ”命令并不会创建包含DATETIME_FORMATDATE_FORMAT的“settings.py”文件。也许这有原因?

执行“d:”、“cd D:\dproj\MSQall\website\GoogleCodeHost”、“python manage.py shell”、“from django.conf import settings”、“settings.DATE_FORMAT”、“settings.DATETIME_FORMAT”这些命令的输出(如预期):

'Y-m-d H:i:sO'
'Y-m-d'

所以“settings.py”文件的内容是被读取的,但在Django管理界面中没有生效。

5 个回答

7

正如Ciro Santilli所说,当USE_L10N = True时,本地化格式会覆盖设置中的DATETIME_FORMAT。不过,你仍然可以通过创建自定义格式文件,按照Django文档中的说明来覆盖DATETIME_FORMAT和其他日期/时间格式

详细的答案可以在这里找到。

USE_L10N = True时,你可以通过创建自定义格式文件,按照Django文档中的说明来覆盖DATE_FORMATDATETIME_FORMATTIME_FORMAT以及其他日期/时间格式

总结一下:

  1. settings.py中设置FORMAT_MODULE_PATH = 'yourproject.formats'
  2. 创建目录结构yourproject/formats/en(如果你使用的不是英语,请用相应的ISO 639-1地区代码替换en),并在所有目录中添加__init__.py文件,使其成为有效的Python模块
  3. 在最底层的目录中添加formats.py,里面包含你想要覆盖的格式定义,比如DATE_FORMAT = 'j. F Y'

实际项目中的示例可以在这里找到。

15

在这里:

USE_L10N = False

DATE_TIME 会生效,因为本地化设置(l10n)会覆盖 DATETIME_FORMATDATE_FORMAT,具体可以参考文档:https://docs.djangoproject.com/en/1.9/ref/settings/#date-format

3

这个方法可以解决一个特定的问题,这个问题在当前的Django实现中是无法通过DATETIME_FORMAT来解决的,因为文档里提到的内容在实际使用中并没有被考虑到。这个方法也有点不太干净,而且和ayaz的回答类似(影响范围较小,只会影响到管理后台的列表视图):

在以下这行代码之后:

(date_format, datetime_format,time_format) = get_date_formats()

这段代码通常在Django的文件夹Lib/site-packages里,你可以在Python的安装目录下找到:

django/contrib/admin/templatetags/admin_list.py

你需要覆盖datetime_format的值(针对模型中的models.DateTimeField):

datetime_format = 'Y-m-d H:i:sO'

如果是只包含日期的字段,则设置为:

date_format = 'Y-m-d'

为了让这个更改生效,你不需要重启网络服务器(比如开发服务器)或者退出管理界面。只需要在网页浏览器里简单刷新一下就可以了。

撰写回答