Django: как отформатировать представление даты DateField?

У меня есть форма с DateField. Существующее значение даты форматируется для отображения следующим образом:

2009-10-03

Как я могу отформатировать это так, чтобы это выглядело так:

03.10.2009

Я нашел виджет, который отображает его так, но проверка не позволяет вводить значения.


person Community    schedule 03.10.2009    source источник
comment
Так много репутации было потрачено впустую на этом. :(   -  person Cary Bondoc    schedule 23.09.2014


Ответы (4)


Чтобы отобразить исходное значение поля в правильном формате, используйте DateInput виджет. Чтобы настроить проверку, используйте аргумент ключевого слова input_formats DateField.

Зачем вам нужны и format, и input_formats?

format - Формат, в котором будет отображаться начальное значение этого поля. См. здесь.

input_formats — список форматов, используемых для преобразования строки в допустимый объект datetime.date. См. здесь.

person Cat Plus Plus    schedule 03.10.2009
comment
Спасибо, это сработало... Теперь это выглядит так: %d.%m.%Y',)) - person ; 03.10.2009
comment
Примечание. Я считаю, что это работает только с Django 1.1 и выше. Я использую 1.0. - person dfrankow; 01.11.2009
comment
Почему необходимы оба формата и input_formats? - person radtek; 12.09.2014
comment
Примечание для тех, кто видит это все эти годы после первоначального вопроса. Осторожнее с этим: initial=date.today(). Имея круглые скобки, вы фактически немедленно вызываете функцию, что означает, что датой по умолчанию для этого поля будет дата выполнения кода (каждый раз, когда вы запускаете сервер WSGI). Я подозреваю, что это не то, что вам нужно, и если это так, вы должны удалить скобки, чтобы Django вызывал date.today только при создании новой модели. - person borfast; 17.12.2016
comment
@radtek, свойство формата предназначено для отображения даты внутри ввода, а input_formats используется для определения допустимого формата, который должен быть принят - person Ahmed Farahat; 27.12.2016
comment
@AhmedFarahat Смотрите мое объяснение - person radtek; 30.12.2016

Метод 1: рендеринг формата вручную, но не проходит проверку формата поля даты

Поэтому лучшим решением для форматирования для вас будет "."

{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}

чтобы получить 24.05.2010

Я добавил stringformat:"02d", чтобы не получать 25.5.2010 в качестве выходного значения.

Я публикую полный код поля, чтобы получить представление:

<input class="form-control" data-inputmask="'mask':'99.99.9999'" data-toggle="masked"  name="{{field.html_name}}" placeholder="{{ field.label }}" {% if field.field.required %}required=""{% endif%} type="text" value="{{field.value.day|stringformat:"02d"}}.{{field.value.month|stringformat:"02d"}}.{{field.value.year}}" " >

В основном я использовал это форматирование для значения даты в существующем экземпляре формы обновления (модели) (класс UpdateView).

Это решение может дать сбой при отправке формы обновления, если оно не соответствует формату

Способ 2: (лучше) автоматизировать форматирование значения поля + правильная проверка с помощью настроек

Это делается путем добавления пользовательских локальных настроек в файл settings.py. Наиболее важной частью является кортеж DATE_INPUT_FORMATS.

..
..
USE_L10N = True
..

DATE_INPUT_FORMATS = (
    '%d.%m.%Y', '%d.%m.%Y', '%d.%m.%y',  # '25.10.2006', '25.10.2006', '25.10.06'
    '%d-%m-%Y', '%d/%m/%Y', '%d/%m/%y',  # '25-10-2006', '25/10/2006', '25/10/06'
    '%d %b %Y',  # '25 Oct 2006', 
    '%d %B %Y',  # '25 October 2006', 
)

DATE_FORMAT = 'j F Y'
TIME_FORMAT = 'H:i'
DATETIME_FORMAT = 'j F Y H:i'
YEAR_MONTH_FORMAT = 'F Y'
MONTH_DAY_FORMAT = 'j F'
SHORT_DATE_FORMAT = 'j N Y'
SHORT_DATETIME_FORMAT = 'j N Y H:i'
FIRST_DAY_OF_WEEK = 1

Самое важное:

  1. Проверка полей даты выполняется при вставке и обновлении всех форматов, присутствующих в кортеже DATE_INPUT_FORMATS.
  2. В updateView поле даты будет отображаться с использованием первого формата кортежа DATE_INPUT_FORMATS (я имею в виду использование DATE_INPUT_FORMATS[0] == '%d.%m.%Y' )

Таким образом, выбор первого элемента важен в этом кортеже, поскольку он определяет форматирование существующего значения поля даты в формах обновления.

Вы также можете применить проверку javascript для UpdateViews, используя этот первый формат.

Проверено на django 1.6 и 1.7 , не знаю для предыдущих версий

person Cherif KAOUA    schedule 23.09.2014
comment
Обратите внимание, что DATE_INPUT_FORMATS — это список в файлах global_settings, а не кортеж. - person Bobort; 02.02.2018

Пользовательское поле подкласса, подобное этому:

class CustomDateField(forms.DateField):
  def __init__(self, *args, **kwargs):
    kwargs.setdefault('input_formats', ("%d.%m.%Y",))
    super(CustomDateField, self).__init__(*args, **kwargs)
person sorki    schedule 03.10.2009

Вы можете показать дату в шаблоне с помощью

{{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}
person qscgyjqscgyj    schedule 08.10.2013
comment
Извините, я был невнимателен - person qscgyjqscgyj; 08.10.2013