Джанго Динамические Формы Сохранить - PullRequest
0 голосов
/ 27 ноября 2009

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

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

Ответы [ 3 ]

1 голос
/ 28 ноября 2009

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

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

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

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

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

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

0 голосов
/ 29 ноября 2009

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

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

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

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

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

0 голосов
/ 28 ноября 2009

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

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

...