Джанго: Как отформатировать представление даты в DateField? - PullRequest
20 голосов
/ 03 октября 2009

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

2009-10-03

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

03.10.2009

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

Ответы [ 4 ]

38 голосов
/ 03 октября 2009

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

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

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

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

11 голосов
/ 23 сентября 2014

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

Так что лучшим решением для вас будет "."

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

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

Я добавил строковый формат: «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 , не знаю для предыдущих версий

6 голосов
/ 03 октября 2009

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

class CustomDateField(forms.DateField):
  def __init__(self, *args, **kwargs):
    kwargs.setdefault('input_formats', ("%d.%m.%Y",))
    super(CustomDateField, self).__init__(*args, **kwargs)
4 голосов
/ 08 октября 2013

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

{{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}
...