Django: использование DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT в settings.py?
Я хотел бы глобально (через весь мой сайт, администратор и интерфейс) настроить способ отображения даты и времени по своему усмотрению, но я не могу понять, что происходит с переменными DATE_FORMAT, DATETIME_FORMAT и TIME_FORMAT в settings.py.
В этом вопросе говорится, что настройки игнорируются. Однако вопрос составляет более года. В документации Django говорится, что они могут использоваться, когда у вас есть USE_L10N = True
и, по-видимому, что-то изменилось в Django 1.2. Согласно this, однако может быть ошибка.
В настоящее время я использую Django 1.2, и когда у меня есть USE_L10N = True
, он просто игнорирует формат даты (времени) в settings.py. Когда у меня есть USE_L10N = False
, он также игнорирует их.
Есть ли способ глобально настроить отображение даты и времени? Или я должен создать свой собственный файл форматов, как предлагает Карен в сообщении Django Users Google Group?
Ответы
Ответ 1
При такой же проблеме решение прост и документировано. Всякий раз, когда вы создаете дату, вам нужно указать, что вы хотите, чтобы шаблон отображал его как дату/время/короткое_дату/дату-время (например, {{ some_date_var | date }}
, а затем он отображает его как указано с помощью DATE_FORMAT
в ваших настройках .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_FORMAT
или SHORT_DATE_FORMAT
или что-то еще.
Ответ 2
Поиск по источнику показывает, что 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()
на все в контексте.
Ответ 3
Вы можете переопределить DATE_FORMAT
, DATETIME_FORMAT
, TIME_FORMAT
и другие форматы даты/времени, когда USE_L10N = True
создание файлов пользовательского формата, как описано в документации Django.
Вкратце:
- Установите
FORMAT_MODULE_PATH = 'yourproject.formats'
в settings.py
- Создать структуру каталогов
yourproject/formats/en
(заменив en
на соответствующий код языка ISO 639-1, если вы используете другой язык, чем английский) и добавьте файлы __init__.py
во все каталоги, чтобы сделать его допустимым модулем Python
- Добавить
formats.py
в каталог листа, содержащий определения формата, которые вы хотите переопределить, например. DATE_FORMAT = 'j. F Y'
.
Пример из фактического проекта здесь.
Ответ 4
Поздний ответ, но, надеюсь, это поможет любому другому, кто ищет это.
Установив USE_L10N = True в ваших настройках, Django ищет форматы, специфичные для локали, что дает им преимущество перед настройками, не связанными с локальностью.
Решение: (для отображения 30/12/2017 на DateField)
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