Django 动态表单保存

Posted

技术标签:

【中文标题】Django 动态表单保存【英文标题】:Django Dynamic Forms Save 【发布时间】:2009-11-27 16:11:09 【问题描述】:

我正在使用 James Bennetts 代码 (link text) 创建动态表单。一切正常,但我现在已经到了需要保存数据并且有点卡住的地步。我知道我可以评估表单返回的数据并将其作为字符串保存到数据库中,但我真正想做的是保存它是什么类型的数据,例如日期、整数、varchar 以及值,以便在查看数据时我可以根据数据的类型对其进行一些处理,例如获取大于上周的日期。

所以我的问题是如何根据表单元素的类型访问表单元素的数据库类型,例如django.forms.IntegerField 的数据库字段类型为 int,django.forms.DateField 将是日期字段,django.forms.ChoiceField 将是 varchar 字段?

【问题讨论】:

【参考方案1】:

您为什么想知道,您使用的是哪种数据库字段?您是否通过原始 sql 存储表单中的信息?您应该有一些模型,用于存储表单中的信息,它将为您完成所有工作。

也许您可以显示一些表单代码?现在很难确定,你到底想做什么。

【讨论】:

【参考方案2】:

我不明白具体的问题,如果我弄错了,请原谅我。

如果您正在使用模型,那么您不需要了解数据库级别的数据类型。它们由 django 根据您的模型字段定义。

但是,由于您在谈论动态表单(我已阅读文章),您可能没有使用模型,至少不是直接使用。在这种情况下,它也不重要,因为您正在使用表单验证,因此,例如,您可以绝对确定整数来自forms.IntegerField 字段,unicode 来自forms.CharField 等等。

如果您是手动编写数据库交互程序(原始 sql),那么您必须自己将 python-types 映射到 db-types,例如 <type 'int'> 转到 integer 类型的列(或其他类型) ),<type 'datetime.datetime'> 转到 datetime 类型的列(或者不是,这个例子是任意的)等等。当您使用模型时,django 会以独立于数据库引擎的方式为您进行此类映射。

无论哪种方式,您自己都在 python 端定义数据类型,您或 django 还必须在 db 端定义数据类型。有时,这些类型的选择不是自动的 1:1 类型的决策,而是一种设计决策,取决于这些数据在您的应用程序中的用途。

对不起,如果这没什么意义,但是,我必须承认,我不太明白你的问题背后的问题。

【讨论】:

我有一个带有 answerId、answer、answerType 的数据库表。 answerId 是一个自动增量字段。 answer 是一个 varchar 字段,包含表单返回的答案, answerType 将是返回的数据类型,可以是 int、datetime、varchar、tinyint 等,并将根据使用的表单元素类型填充。所以答案将被存储为 varchars 但我仍然可以告诉他们应该是什么类型的对象。例如在表格中,虽然日期字段将存储为字符串:2009-01-12 00:00:00 我仍然可以看出数据确实是日期时间字段。【参考方案3】:

如果您使用的是 James 的代码,那么您不会从表单本身中得到 Model,而是表单字段元素的列表。这意味着您不能将数据保存为 Model 实例。

我认为你有两个选择;将整个表单捆绑到 JSON 对象中并将其保存到数据库中的 LONGTEXT 变量中,或者将每个表单元素单独保存到数据库的一行中,将其保存到 BLOB 条目中。在这种情况下,您需要在保存之前“腌制”对象。如果您腌制对象并将其保存到数据库中,当您检索并取消腌制它时,您将拥有与该对象关联的所有 Python 类信息。

试图让这一点更清楚 - 如果你有字节; 2009-11-28 21:34:36.516176,这是 str 还是 datetime 对象?您无法判断它是作为VARCHAR 还是LONGTEXT 存储在数据库中的。这是您问题的核心 - 如果您将其保存为腌制对象,您确实会获得对象信息。

通过扩展,您可以将整个 Form 对象保存到数据库中,或者作为 JSON 对象,或者腌制对象并保存。

我目前正在与非常相似的事情作斗争,因为我正在尝试组合一个动态表单系统,并考虑将“单个表单字段元素,腌制”然后保存到数据库中。所以我会看这个问题是如何解决的! :)

【讨论】:

以上是关于Django 动态表单保存的主要内容,如果未能解决你的问题,请参考以下文章

Django:使用外键保存动态表单

Django 动态表单,带有 HTML 数组的表单集

Django:在表单向导中为步骤动态设置表单集

Django 中的动态表单要求

在一个 django 表单元素上覆盖数据验证

Django 表单字段动态显示