Формат даты 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, вы можете написать форму с пользовательской проверкой для этого поля.