Python 在模型中存储动态表单
我想使用Django构建一个系统,允许用户构建表单、存储表单并让客户使用表单。我知道如何动态地创建表单,但我正在寻找一种好的方法来继续使用表单类,并以优雅的方式处理许多不同用户的动态表单 我正在考虑将表单字段信息作为字典存储在数据库中。django中是否有任何方法可以将此词典重新解释回表单对象?或者我必须自己编写一个例程来解释和构建html表单吗Python 在模型中存储动态表单,python,django-forms,Python,Django Forms,我想使用Django构建一个系统,允许用户构建表单、存储表单并让客户使用表单。我知道如何动态地创建表单,但我正在寻找一种好的方法来继续使用表单类,并以优雅的方式处理许多不同用户的动态表单 我正在考虑将表单字段信息作为字典存储在数据库中。django中是否有任何方法可以将此词典重新解释回表单对象?或者我必须自己编写一个例程来解释和构建html表单吗 如果有人知道在哪里可以找到这些信息,我会非常感激。这是一个Python问题,而不是Django问题,我的标签从哪里编辑 复制,复制,例如: class
如果有人知道在哪里可以找到这些信息,我会非常感激。这是一个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) }
当然,表单类最终将绑定到namef
(您可以使用setattr
将其绑定到限定的名称某物。MyForm
用于适当的某物,但是请不要梦想将其绑定到一个动态变量的裸的名称,使用这样的裸名称也将是一场噩梦!)
因此,要在运行时重新创建表单类对象,需要保留:
其名称MyForm
字段名作为键,字段对象作为值的dict
为了使第2点起作用,您同样需要为每个字段(除了其名称之外)保留类型名称(这样您就可以使用getattr
从forms
恢复类型)及其命名参数(作为dict),这样您基本上可以这样做
d[fieldname]=getattr(表单,fieldtypename)(**fieldparameters)
根据字符串fieldname
和fieldtypename
以及dictfieldparameters
,为每个字段重建字典d
(即,准备满足上述短列表的步骤2;-).您也可以对对象进行pickle并将其存储在数据库中。但是,我认为您可能会遇到Alex提示的不同名称的问题。谢谢!在发布问题后,我实际上做了更多的挖掘,并找到了一篇关于如何使用django(James Bennett的动态表单文章)执行此操作的好文章。从James文章中,您应该参考forms.BaseForm而不是forms.Formf=type(forms.Form)('MyForm',forms.Form,d)变成了f=type(forms.Form)('MyForm',forms.BaseForm,d)