Django: 在settings.py中使用DATE_FORMAT、DATETIME_FORMAT、TIME_FORMAT?
我想在我的整个网站上(包括后台和前台)调整日期和时间的显示方式,让它符合我的喜好,但我搞不清楚在settings.py
里,DATE_FORMAT、DATETIME_FORMAT和TIME_FORMAT这几个变量到底是怎么回事。
在这个问题里提到这些设置会被忽略。不过那个问题已经有一年多了。在Django的文档里说,当你设置USE_L10N = True
时,这些格式是可以用的,而且似乎在Django 1.2版本中发生了一些变化。不过根据这个讨论,可能还有个bug。
我现在使用的是Django 1.2,当我把USE_L10N = True
时,settings.py里的日期(时间)格式就被忽略了。当我把USE_L10N = False
时,它似乎也同样被忽略。
有没有办法可以全局自定义日期和时间的显示?还是说我应该像Karen在Django用户Google小组的帖子里建议的那样,创建一个自己的自定义格式文件?
5 个回答
当你把 USE_L10N = True
设置为真的时候,你可以通过创建自定义格式文件来覆盖 DATE_FORMAT
、DATETIME_FORMAT
、TIME_FORMAT
以及其他日期/时间格式。
简单来说,你需要做以下几步:
- 在
settings.py
文件中设置FORMAT_MODULE_PATH = 'yourproject.formats'
- 创建目录结构
yourproject/formats/en
(如果你使用的语言不是英语,就把en
替换成相应的ISO 639-1语言代码),并在所有目录中添加__init__.py
文件,这样才能让它成为一个有效的Python模块 - 在最底层的目录中添加
formats.py
文件,里面写上你想要覆盖的格式定义,比如DATE_FORMAT = 'j. F Y'
。
你可以在这个实际项目中看到一个例子 这里。
通过查看源代码可以发现,DATETIME_FORMAT等只有在调用django.utils.formats.localize()
时才会被使用,而这个函数似乎只在渲染django.template.VariableNode
时被调用。
我不太确定VariableNode
在模板渲染中具体什么时候用,但我猜如果你开启了settings.USE_L10N
并且有一个VariableNode
,那么它就会被本地化处理。
localize
的样子是这样的:
def localize(value):
"""
Checks if value is a localizable type (date, number...) and returns it
formatted as a string using current locale format
"""
if settings.USE_L10N:
if isinstance(value, (decimal.Decimal, float, int)):
return number_format(value)
elif isinstance(value, datetime.datetime):
return date_format(value, 'DATETIME_FORMAT')
elif isinstance(value, datetime.date):
return date_format(value)
elif isinstance(value, datetime.time):
return time_format(value, 'TIME_FORMAT')
return value
为了回答你的问题,我可能会写一个简单的上下文处理器,让它对上下文中的所有内容都调用localize()
。
我也遇到过同样的问题,解决方法其实很简单,而且有说明。每当你要显示一个日期的时候,你需要告诉模板你希望它把这个日期显示成日期/时间/短日期/日期时间的格式(比如说,{{ some_date_var | date }}
),这样它就会按照你在settings.py里设置的DATE_FORMAT
来显示。
举个例子:
>>> from django.conf import settings # imported to show my variables in settings.py
>>> settings.DATE_FORMAT # - showing my values; I modified this value
'm/d/Y'
>>> settings.TIME_FORMAT
'P'
>>> settings.DATETIME_FORMAT
'N j, Y, P'
>>> from django.template import Template, Context
>>> from datetime import datetime
>>> c = Context(dict(moon = datetime(1969, 7, 20, 20, 17, 39))) # Create context with datetime to render in a template
>>> print c['moon'] # This is the default format of a printing datetime object
1969-07-20 20:17:39
>>> print Template("default formatting : {{ moon }}\n"
"use DATE_FORMAT : {{ moon|date }}\n"
"use TIME_FORMAT : {{ moon|time }}\n"
"use DATETIME_FORMAT: {{ moon|date:'DATETIME_FORMAT' }}\n"
"use SHORT_DATETIME_FORMAT: {{ moon|date:'SHORT_DATETIME_FORMAT' }}"
).render(c)
default formatting : 1969-07-20 20:17:39
use DATE_FORMAT : 07/20/1969
use TIME_FORMAT : 8:17 p.m.
use DATETIME_FORMAT: July 20, 1969, 8:17 p.m.
use SHORT_DATETIME_FORMAT: 07/20/1969 8:17 p.m.
这样做是有道理的;比如说,模板需要知道它应该使用DATE_FORMAT
、SHORT_DATE_FORMAT
,或者其他的格式。