Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在模型中存储动态表单_Python_Django Forms - Fatal编程技术网

Python 在模型中存储动态表单

Python 在模型中存储动态表单,python,django-forms,Python,Django Forms,我想使用Django构建一个系统,允许用户构建表单、存储表单并让客户使用表单。我知道如何动态地创建表单,但我正在寻找一种好的方法来继续使用表单类,并以优雅的方式处理许多不同用户的动态表单 我正在考虑将表单字段信息作为字典存储在数据库中。django中是否有任何方法可以将此词典重新解释回表单对象?或者我必须自己编写一个例程来解释和构建html表单吗 如果有人知道在哪里可以找到这些信息,我会非常感激。这是一个Python问题,而不是Django问题,我的标签从哪里编辑 复制,复制,例如: class

我想使用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) }
当然,表单类最终将绑定到name
f
(您可以使用
setattr
将其绑定到限定的
名称
某物。MyForm
用于适当的
某物
,但是请不要梦想将其绑定到一个动态变量的裸的名称,使用这样的裸名称也将是一场噩梦!)

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

  • 其名称
    MyForm
  • 字段名作为键,字段对象作为值的dict
  • 为了使第2点起作用,您同样需要为每个字段(除了其名称之外)保留类型名称(这样您就可以使用
    getattr
    forms
    恢复类型)及其命名参数(作为dict),这样您基本上可以这样做

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


    根据字符串
    fieldname
    fieldtypename
    以及dict
    fieldparameters
    ,为每个字段重建字典
    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)