Django: Как форматировать представление даты DateField?
У меня есть форма с DateField. Существующее значение даты форматируется так, чтобы выглядеть следующим образом:
2009-10-03
Как я могу отформатировать это так, чтобы оно выглядело следующим образом:
03.10.2009
Я нашел виджет, который делает это так, но проверка не позволяет вводить значения.
Ответы
Ответ 1
Чтобы правильно отобразить исходное значение поля, используйте DateInput
виджет. Чтобы настроить проверку, используйте input_formats
аргумент ключевого слова DateField
.
Зачем вам нужны format
и input_formats
?
format
- Формат, в котором будет отображаться начальное значение этого поля. См. здесь.
input_formats
- список форматов, используемых для преобразования строки в действительный объект datetime.date. См. здесь.
Ответ 2
Способ 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
Самое главное:
- Проверка полей дат выполняется при вставке и обновлении со всеми форматами, присутствующими в DATE_INPUT_FORMATS tuple
- В updateView поле даты будет отображаться с использованием первого формата DATE_INPUT_FORMATS tuple (я имею в виду использование DATE_INPUT_FORMATS [0] == '% d.% m. % Y ')
Таким образом, выбор первого элемента важен в этом кортеже, поскольку он определяет формирование существующего значения поля даты в формах обновления.
Вы можете применить проверку JavaScript для UpdateViews, используя этот первый формат.
Проверено на django 1.6 и 1.7, не знаю предыдущих версий
Ответ 3
Пользовательское поле подкласса:
class CustomDateField(forms.DateField):
def __init__(self, *args, **kwargs):
kwargs.setdefault('input_formats', ("%d.%m.%Y",))
super(CustomDateField, self).__init__(*args, **kwargs)
Ответ 4
Вы можете показать дату в шаблоне с помощью
{{ your_object.date_field.day }}.{{ your_object.date_field.month }}.{{ your_object.date_field.year }}