我想使用 Django 构建一个系统,允许用户构建表单、存储表单并让客户使用它们。我知道如何动态创建表单,但我正在寻找一种仍然使用表单类并以优雅的方式处理许多不同用户的动态表单的好方法。
我正在考虑将表单字段信息作为字典存储在数据库中。 django 有没有办法将这个字典重新解释回表单对象?或者我是否必须编写一个例程来简单地解释并自己构建 html 表单?
如果有人知道在哪里向我提供信息,我将非常感激。
最佳答案
这是一个 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) }
当然,最终表单类将绑定(bind)到名称f
(您可以使用setattr
将其绑定(bind)到限定名称something.MyForm
用于适当的something
,但请甚至不要梦想将其绑定(bind)到裸名称这是动态变量——使用这样的裸名也将是一场噩梦!)。
因此,要在运行时重新创建表单类对象,您需要保留:
- 其名称
MyForm
- 以字段名称作为键、以字段对象作为值的字典
为了使第 2 点起作用,您同样需要为每个字段(除了其名称)保留 type 名称(这样您就可以使用 getattr
恢复类型)来自 forms
)及其命名参数(作为字典),所以你基本上可以这样做
d[字段名称] = getattr(表单, 字段类型名称)(**字段参数)
基于字符串fieldname
和fieldtypename
以及字典fieldparameters
,对于每个字段,当您重建字典d
时(即,准备满足上述短列表中的第 2 步;-)。
关于python - 在模型中存储动态形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3792083/