如何启用Django的“DATETIME_FORMAT”?
在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_FORMAT
或DATE_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 个回答
正如Ciro Santilli所说,当USE_L10N = True
时,本地化格式会覆盖设置中的DATETIME_FORMAT
。不过,你仍然可以通过创建自定义格式文件,按照Django文档中的说明来覆盖DATETIME_FORMAT
和其他日期/时间格式。
详细的答案可以在这里找到。
当
USE_L10N = True
时,你可以通过创建自定义格式文件,按照Django文档中的说明来覆盖DATE_FORMAT
、DATETIME_FORMAT
、TIME_FORMAT
以及其他日期/时间格式。总结一下:
- 在
settings.py
中设置FORMAT_MODULE_PATH = 'yourproject.formats'
- 创建目录结构
yourproject/formats/en
(如果你使用的不是英语,请用相应的ISO 639-1地区代码替换en
),并在所有目录中添加__init__.py
文件,使其成为有效的Python模块- 在最底层的目录中添加
formats.py
,里面包含你想要覆盖的格式定义,比如DATE_FORMAT = 'j. F Y'
。实际项目中的示例可以在这里找到。
在这里:
USE_L10N = False
DATE_TIME
会生效,因为本地化设置(l10n)会覆盖 DATETIME_FORMAT
和 DATE_FORMAT
,具体可以参考文档:https://docs.djangoproject.com/en/1.9/ref/settings/#date-format
这个方法可以解决一个特定的问题,这个问题在当前的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'
为了让这个更改生效,你不需要重启网络服务器(比如开发服务器)或者退出管理界面。只需要在网页浏览器里简单刷新一下就可以了。