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

时间:2010-09-01 12:08:59

标签: django date time settings

我想全局(通过我的整个网站,管理员和前端)调整日期和时间显示给我的喜好的方式,但我无法弄清楚DATE_FORMAT,DATETIME_FORMAT和TIME_FORMAT变量的变化情况settings.py。

this question中,它表示忽略了设置。问题是超过一年了。在Django文档中,它表示当你在Django 1.2中有USE_L10N = True和显然something changed时可以使用它们。根据{{​​3}},但可能存在错误。

我目前正在使用Django 1.2,当我有USE_L10N = True时,它只是忽略settings.py中的日期(时间)格式。当我USE_L10N = False时,它似乎也忽略了它们。

有没有办法全局自定义日期和时间显示?或者我应该创建自己的自定义格式文件,正如Karen在Django Users Google Group帖子中建议的那样?

4 个答案:

答案 0 :(得分:9)

通过源搜索显示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()

答案 1 :(得分:8)

有同样的问题,解决方案是simple and documented。每当您渲染日期时,您需要指定您希望模板将其呈现为日期/时间/ short_date /日期时间(例如{{ some_date_var | date }},然后它将按照您在DATE_FORMAT中的指定呈现它settings.py

示例:

>>> 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或其他。

答案 2 :(得分:2)

您可以DATE_FORMAT DATETIME_FORMAT覆盖TIME_FORMATUSE_L10N = TrueFORMAT_MODULE_PATH = 'yourproject.formats'和其他日期/时间格式。

总结:

  1. settings.py
  2. 中设置yourproject/formats/en
  3. 创建目录结构en(如果您使用的是其他语言环境,则使用相应的ISO 639-1语言环境代码替换__init__.py)并将formats.py个文件添加到所有目录中一个有效的Python模块
  4. DATE_FORMAT = 'j. F Y'添加到叶目录,其中包含您要覆盖的格式定义,例如{{1}}。
  5. 来自实际项目的示例creating custom format files as described in Django documentation

答案 3 :(得分:1)

迟到的回复,但希望这会帮助其他人搜索此内容。 通过在您的设置中设置USE_L10N = True,Django会查找特定于语言环境的格式,使其优先于非语言环境相关设置。

解决方案:(在DateField上显示30/12/2017)

from django.conf.locale.en import formats as en_formats

en_formats.DATE_FORMAT = "%d/%m/%Y"

和输入(接受30/12/2017或30-12-2017)

en_formats.DATE_INPUT_FORMATS = ['%d/%m/%Y', '%d-%m-%Y']

参考:https://mounirmesselmeni.github.io/2014/11/06/date-format-in-django-admin/

*在Django上测试== 1.10.7