Сохранить динамические формы Django

Я использую код Джеймса Беннета (текст ссылки ) для создания динамической формы. Все работает нормально, но теперь я дошел до того, что мне нужно сохранить данные, и я немного застрял. Я знаю, что могу оценить данные, возвращаемые формой, и просто сохранить их в базе данных в виде строки, но мне бы очень хотелось сохранить тип данных, например. date, integer, varchar вместе со значением, чтобы, когда дело доходит до просмотра данных, я мог выполнять некоторую обработку в зависимости от их типа, например. получить даты больше, чем на прошлой неделе.

Итак, мой вопрос заключается в том, как мне получить доступ к типу базы данных, на основе которого элемент формы основан на типе элемента формы, например. django.forms.IntegerField имеет тип поля базы данных int, django.forms.DateField будет полем даты, а django.forms.ChoiceField будет полем varchar?


person John    schedule 27.11.2009    source источник


Ответы (3)


Почему вы хотите знать, какое поле базы данных вы используете? Вы храните информацию из формы через сырой sql? У вас должна быть какая-то модель, что вы храните информацию из формы и она будет делать всю работу за вас.

Может быть, вы могли бы показать какой-нибудь код формы? Сейчас трудно определить, что именно вы пытаетесь сделать.

person gruszczy    schedule 28.11.2009

Я не могу понять точную проблему, поэтому простите меня, если я ошибаюсь.

Если вы используете модели, вам не нужно знать о типах данных уровня базы данных. Они определяются django в соответствии с полями вашей модели.

Однако, поскольку вы говорите о динамических формах (я читал статью), вы, вероятно, не работаете с моделями, по крайней мере, напрямую. В этом случае это также не должно иметь значения, потому что вы используете проверку формы, поэтому, например, вы можете быть абсолютно уверены, что целое число выходит из поля forms.IntegerField, юникод выходит из forms.CharField и так далее.

Если вы пишете свои процедуры взаимодействия с базой данных вручную (необработанный sql), вам нужно самостоятельно сопоставить типы python с типами db, например, <type 'int'> переходит в столбец типа integer (или что-то в этом роде), <type 'datetime.datetime'> переходит в datetime тип столбца (или нет, этот пример произвольный) и так далее. Когда вы используете модели, django выполняет этот тип сопоставления для вас независимым от механизма базы данных способом.

В любом случае, вы сами определяете типы данных на стороне Python, и вы или django также должны определять типы данных на стороне db. Выбор этих типов иногда является не автоматическим решением типа 1:1, а, скорее, проектным решением, основанным на том, для чего эти данные используются в вашем приложении.

Извините, если в этом мало смысла, но, должен признаться, я не совсем понимаю проблему, стоящую за вашим вопросом.

person shylent    schedule 28.11.2009
comment
У меня есть таблица базы данных с answerId, answer, answerType. answerId — это поле с автоинкрементом. answer представляет собой поле varchar и содержит ответ, возвращаемый формой, а answerType будет типом возвращаемых данных, которые могут быть int, datetime, varchar, tinyint и т. д., и будут заполняться в зависимости от того, какой тип элемента формы использовался. Таким образом, ответы будут храниться в виде varchars, но я все еще могу сказать, какого типа объект они должны быть. например в таблице, хотя поле даты будет сохранено в виде строки: 2009-01-12 00:00:00 Я все еще могу сказать, что данные действительно относятся к полю даты и времени. - person John; 30.11.2009

Если вы используете код Джеймса, то вы получаете не Model из формы как таковой, а список элементов поля формы. Это означает, что вы не можете сохранить данные как экземпляр Model.

Я думаю, у вас есть два варианта; свяжите всю форму в объект JSON и сохраните его в переменной LONGTEXT в своей базе данных или сохраните каждый элемент формы в отдельной строке базы данных, сохранив его в записи BLOB. В этом случае перед сохранением объекта вам необходимо «замариновать» его. Если вы выберете объект и сохраните его в базе данных, когда вы извлечете его и распаковаете, у вас будет вся информация о классе Python, связанная с объектом.

Попытка сделать это более понятным - если у вас есть байты; 2009-11-28 21:34:36.516176, это объект str или datetime? Вы не можете сказать, хранится ли он в базе данных как VARCHAR или LONGTEXT. В чем суть вашего вопроса - вы действительно получаете информацию об объекте, если сохраняете ее как маринованный объект.

Кроме того, вы можете сохранить весь объект Form в базе данных либо как объект JSON, либо замариновать объект и сохранить его.

В данный момент я борюсь с чем-то очень похожим, так как пытаюсь собрать динамическую систему форм и думаю о том, чтобы использовать «отдельный элемент поля формы, маринованный», а затем сохранить его в базе данных. Так что я буду смотреть, как этот вопрос работает! :)

person TonyM    schedule 28.11.2009