2013-06-18 4 views
0

forms.pyсохранить дату в одном формате в базе данных - Django

INPUT_FORMAT = (
('%d/%m/%Y','%m/%d/%Y') 
) 
class ReportDatetimeForm(forms.ModelForm): 
date = forms.DateField(input_formats = INPUT_FORMAT, 
widget=forms.DateInput() 

class Meta: 
model = Report 
fields = ['date'] 

Это моя форма, чтобы получить вход в качестве даты с двумя различными format.While давая даты ввода в этом формате %m/%d/%Y' дата и месяц получает обмен в то время как сохранить в базе данных. Это влияет на мое приложение. Так что я хочу сохранить оба формата ввода в одном формате, а именно yyyy-mm-dd, поэтому, какой бы входной формат пользователь не вводил, данный формат должен сохраняться в вышеупомянутом формате.

Я хочу знать, как написать пользовательскую функцию в forms.py, чтобы сохранить дату в базе данных в одном формате.

Благодаря

+0

Вы задали варианты этого вопроса как минимум 3 раза. Прекратите злоупотреблять stackoverflow. Я объяснил, почему у вас проблемы, и это не проблема с кодом. Вы не понимаете основы использования дат. Поговорите с вашим коллегой и, возможно, они помогут вам понять, что вы делаете неправильно. –

ответ

1

Фактическая дата, которые хранятся в базе данных не имеет никакого отношения к входному тексту происходит в на поле. Даты хранятся как объекты даты, а не произвольные строки.

Проблема, с которой вы сталкиваетесь, состоит в том, что два формата, которые вы указываете как действительные, производят разные объекты даты, для одного и того же ввода, некоторое время. Они неоднозначны.

Если пользователь вводит строку «01/02/1990» в поле формы, какова фактическая дата? Это 1 февраля 1990 года; или это 2 января 1990 года? В вашей конкретной реализации выбранная дата будет первым форматом: 1 февраля. Она проверит каждый формат даты в порядке и попытается проанализировать дату. Если он был успешным, он создает дату и сохраняет ее. Если это не удалось, он пробует каждый следующий формат.

Либо выберите один формат или несколько форматов, которые никогда не могут быть двусмысленными. Использование javascript calendar picker может быть чрезвычайно полезным или даже отдельными текстовыми вводами для разных частей даты.

Что вы должны сделать, это разрешить только формат даты ISO8601 «YYYY-MM-DD» в вашей форме django. Внутри пользовательского интерфейса вы можете разрешить пользователю вводить даты в любом формате, который им нравится, до тех пор, пока вы его конвертируете (с javascript) в формат «YYYY-MM-DD» перед отправкой на сервер. Но то, что вы ДОЛЖНЫ делать, - это 3 отдельных ввода текста - по одному для дня, месяца и года.

+0

Нет, это не проблема. Я объяснил, в чем проблема. Попробуйте ввести эту дату: «12/29/2013» и посмотрите, правильно ли представлена ​​дата в базе данных. Выбор формата даты в пользовательском интерфейсе абсолютно не влияет на формат даты допустимой формы. Вы предоставляете двусмысленную дату в виде строки, и форма пытается ввести ваши данные в порядок и выбирая THAT one. –

+0

Josh, эта проблема происходит, когда введенная дата и месяц меньше 12, как заставить ее работать во всех форматах ввода/как решить эту проблему. Я столкнулся с этой проблемой с прошлой пятницы, пожалуйста, скажите мне на уровне кода, как решить это. – user2086641

+0

@ user2086641 Я знаю, когда это происходит. Мой ответ объясняет, почему это происходит. Мой ответ также объясняет, как вы должны это исправить. Это не проблема кода для вас, это проблема здравого смысла. «01/02/2013» неоднозначно. Используйте 3 отдельных текстовых ввода в вашей форме; по одному на день, месяц и год. Затем в методе «save» вашей формы создайте фактический объект даты. Прекратите использование ModelForms для этой конкретной проблемы и используйте стандартную форму. Вам нужно понять, в чем проблема. Я сделал все, что мог. –

Смежные вопросы