Формат даты django 'dd-mm-yyyy'
Есть ли способ получить django для хранения моих данных в postgresql как "dd-mm-yyyy" (если требуется) и иметь формы django для "dd-mm-yyyy"?
(Я пробовал без особого успеха такие вещи, как:
DATE_INPUT_FORMATS = ('%d-%m-%Y')
USE_I18N = True
USE_L10N = True
И сделал много поисковых запросов, но не успел: (
Ответы
Ответ 1
Проблема оказалась в том, что мне нужны форматы даты ISO и Великобритании в файле settings.py
:
DATE_INPUT_FORMATS = ('%d-%m-%Y','%Y-%m-%d')
а затем формы .py настроены на следующее:
class ClientDetailsForm(ModelForm):
date_of_birth = DateField(input_formats=settings.DATE_INPUT_FORMATS)
class Meta:
model = ClientDetails
Почему USE_L10N = True
не может просто сделать это, я не знаю!
[Благодаря this и this]
Ответ 2
DATE_INPUT_FORMATS
в settings.py не влияет на USE_I18N = True
. Это связано с тем, что django загружает определенный формат для активной локали. Django поставляется с определениями форматов для многих разных локалей.
Вы можете переопределить определения формата django по умолчанию:
mysite/
formats/
__init__.py
en/
__init__.py
formats.py
Как описано в документации django: Создание файла пользовательских форматов
Ответ 3
В ответ Sevenearths есть комментарий
Почему USE_L10N = True
не может просто сделать это, я не знаю!
В документации указано, что USE_L10N = True
является настройкой по умолчанию, но чтобы получить даты Великобритании для работы, LANGUAGE_CODE
также необходимо изменить от значения по умолчанию от en-us
до en-GB
.
После изменения поля даты автоматически принимают форматы "dd/mm/yyyy" и "yyyy-mm-dd" (и, возможно, другие, я не тестировал их все) без необходимости устанавливать input_formats = settings.DATE_INPUT_FORMATS
в каждой форме поле даты.
Ответ 4
Это не может быть ответом на точный вопрос, но так как я здесь... Я бы предложил использовать виджет даты и позволить Django сохранить дату так, как она ее понимает. Определите поле в своей форме следующим образом:
import datetime
from django import forms
def last_years():
first_year = datetime.datetime.now().year - 6
return list(range(first_year + 7, first_year, -1))
class MyForm(forms.Form):
# This is it... it user friendly, and can't go wrong parsing it
date = forms.DateField(widget=forms.SelectDateWidget(years = last_years()))
Если вы попали в поле даты Django Model, то единственной проблемой, которая осталась бы, будет форматирование выходного представления. Я прав?
Ответ 5
Я бы перезаписал DateTimeField, поставил свою логику. Неважно, как Postgresql его хранит, вы можете отформатировать его, как хотите.
Docs:
http://docs.djangoproject.com/en/dev/ref/models/instances/
Ответ 6
Вы можете использовать CharField, если хотите сохранить его именно в этом формате, иначе он будет использовать формат python datetime.
Если вы используете CharField, вы можете написать форму с пользовательской проверкой для этого поля.