Джанго: Использование DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT в settings.py? - PullRequest
15 голосов
/ 01 сентября 2010

Я хотел бы глобально (через весь мой сайт, администратора и интерфейс) настроить способ отображения даты и времени по своему вкусу, но я не могу понять, что происходит с переменными 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?

Ответы [ 4 ]

9 голосов
/ 05 сентября 2010

Поиск по источнику показывает, что 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() для всего в контексте.

8 голосов
/ 29 января 2011

Была такая же проблема, решение просто и задокументировано .Всякий раз, когда вы визуализируете дату, вам нужно указать, что вы хотите, чтобы шаблон отображал ее как date / time / 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 или что-то еще.

2 голосов
/ 13 сентября 2016

Вы можете переопределить DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT и другие форматы даты / времени, когда USE_L10N = True на создает файлы пользовательского формата, как описано в документации Django .

В итоге:

  1. Set FORMAT_MODULE_PATH = 'yourproject.formats' in settings.py
  2. Создать структуру каталогов yourproject/formats/en (заменив en на соответствующий код локали ISO 639-1, если вы используете другую локаль, кроме английского), и добавьте файлы __init__.py во все каталоги, чтобы сделать его действительным модулем Python
  3. Добавьте formats.py в конечный каталог, содержащий определения форматов, которые вы хотите переопределить, например, DATE_FORMAT = 'j. F Y'.

Пример из реального проекта здесь .

1 голос
/ 06 декабря 2017

Поздний ответ, но, надеюсь, это поможет всем, кто ищет это. Установив 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/

* проверено на Джанго == 1.10.7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...