Django: 在settings.py中使用DATE_FORMAT、DATETIME_FORMAT、TIME_FORMAT?

22 投票
5 回答
23614 浏览
提问于 2025-04-16 03:34

我想在我的整个网站上(包括后台和前台)调整日期和时间的显示方式,让它符合我的喜好,但我搞不清楚在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 个回答

9

当你把 USE_L10N = True 设置为真的时候,你可以通过创建自定义格式文件来覆盖 DATE_FORMATDATETIME_FORMATTIME_FORMAT 以及其他日期/时间格式。

简单来说,你需要做以下几步:

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

你可以在这个实际项目中看到一个例子 这里

11

通过查看源代码可以发现,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()

13

我也遇到过同样的问题,解决方法其实很简单,而且有说明。每当你要显示一个日期的时候,你需要告诉模板你希望它把这个日期显示成日期/时间/短日期/日期时间的格式(比如说,{{ 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_FORMATSHORT_DATE_FORMAT,或者其他的格式。

撰写回答