Django: использование формата даты, формата DATETIME, формата времени в settings.py?
Я хотел бы глобально (через весь мой сайт, admin и front-end) настроить способ отображения дат и времени по моим предпочтениям, но я не могу понять, что происходит с переменными DATE_FORMAT, DATETIME_FORMAT и TIME_FORMAT в settings.py.
на этот вопрос он говорит, что параметры игнорируются. Вопрос, однако, старше года. В документации Django говорится, что их можно использовать, когда у вас есть USE_L10N = True
и, видимо, что-то изменилось в Django 1.2. Согласно этой однако может быть ошибка.
В настоящее время я использую Django 1.2 и когда у меня есть USE_L10N = True
Он просто игнорирует формат даты(времени) в settings.py - ... Когда у меня есть USE_L10N = False
Он также, кажется, игнорирует их.
есть ли способ, чтобы глобально настроить отображение даты и времени? Или я должен создать свой собственный файл пользовательских форматов, как предлагает Карен в сообщении группы пользователей Django Google?
4 ответов
была такая же проблема, решение простой и документально. Всякий раз, когда вы отображаете дату, вам нужно указать, что вы хотите, чтобы шаблон отображал ее как дату/время/short_date / datetime (например, {{ 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_FORMAT
или SHORT_DATE_FORMAT
или что-то еще.
поиск по источнику показывает, что DATETIME_FORMAT и т. д., используются только когда django.utils.formats.localize()
вызывается, и это только кажется вызываемым, когда django.template.VariableNode
s отображаются.
Я не уверен, когда именно VariableNode
s используются в рендеринге шаблонов, но я бы предположил, что если у вас есть 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()
обо всем в контексте.
можно переопределить DATE_FORMAT
, DATETIME_FORMAT
, TIME_FORMAT
и другие форматы даты и времени, когда USE_L10N = True
by создание пользовательских файлов формата, как описано в документации Django.
в итоге:
- Set
FORMAT_MODULE_PATH = 'yourproject.formats'
наsettings.py
- создать структуру каталогов
yourproject/formats/en
(вместоen
С соответствующим кодом ISO 639-1, если вы используете другой язык, чем английский) и добавить__init__.py
файлы и каталоги, чтобы сделать его действительным Модуль Python - добавить
formats.py
в каталог leaf, содержащий определения формата, которые вы хотите переопределить, напримерDATE_FORMAT = 'j. F Y'
.
пример из реального проекта здесь.
поздний ответ, но, надеюсь, это поможет кому-то еще искать это. Установив USE_L10N = True в настройках, Django ищет форматы, специфичные для локали, предоставляя им приоритет над настройками, не связанными с локали.
решение: (для отображения 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