在模型中存储动态表单

时间:2010-09-25 01:35:05

标签: python django-forms

我想使用Django构建一个系统,允许用户构建表单,存储表单并让客户使用它们。我知道如何动态创建表单但是我正在寻找一种好方法来继续使用表单类并以优雅的方式处理许多不同用户的动态表单。

我正在考虑将表单字段信息存储为db中的字典。在django中有什么方法可以将这个字典重新解释为表单对象吗?或者我是否必须编写一个例程来简单地解释并在html中构建一个表单?

如果有人知道在哪里向我指出信息,我真的很感激。

1 个答案:

答案 0 :(得分:3)

这是一个Python问题,而不是Django问题,我的标签编辑。

重现相当于:

class MyForm(forms.Form):
    foo = forms.CharField(max_length=100)

你需要这样的东西:

f = type(forms.Form)('MyForm', forms.Form, d)

其中d是一个字典,如:

d = { 'foo': forms.CharField(max_length=100) }

当然,最后,表单类将绑定到名称f(您可以使用setattr将其绑定到限定名称something.MyForm一个合适的something,但甚至不想将它绑定到动态变量的名称 - 这也是使用这样的名字!)。

因此,要在运行时重新创建表单类对象,您需要保留:

  1. 其名称MyForm
  2. 一个字典,字段名称为键,字段对象为值
  3. 为了使第2点工作,您同样需要为每个字段(除了名称之外)保留类型名称(这样您就可以从{{{{}}恢复类型getattr 1}})及其命名参数(作为dict),所以你基本上可以做

    d [fieldname] = getattr(forms,fieldtypename)(** fieldparameters)

    基于字符串formsfieldname以及dict fieldtypename,对于每个字段,当您重建字典fieldparameters时(即,准备满足上述短片的第2步)列表; - 。)