动态添加的表单字段将在form.cleaned_data中删除

ty.*_*ty. 7 django django-forms

我在我的模板中放了一些客户端Javascript,允许用户动态地向表单添加字段.我的问题是这些字段被清理干净form.cleaned_data,所以我无法以这种方式访问​​它们.

所有的字段都可以访问request.POST,所以我可以用这个解决这个问题,但我想以"正确的方式"做到这一点,我认为解决方案在于使用django表单而不是直接读取请求.

我尝试重写form.clean(),但似乎数据在它到达时已经消失了.

其他细节:我正在命名这些字段fieldname_x,其中x是一个数字.In request.POST,request.POST['fieldname']是所有值的列表,但form.cleaned_data仅包含每个列表的最后一个值.

Jos*_*ton 2

您事先知道这些字段将是什么类型吗?它们只是简单的文本字段吗?我做过类似的事情,创建动态表单。

# make sure these exist by examining request.POST
custom_fields = ['fieldname_1', 'fieldname_2']

attrs = dict((field, forms.CharField(max_length=100, required=False)) 
             for field in custom_fields)
DynamicForm = type("DynamicForm", (YourBaseForm,), attrs)
submitted_form = DynamicForm(request.POST)
Run Code Online (Sandbox Code Playgroud)

您提交的表单现在应该包含您需要的所有字段及其值。您可能想删除 required=False,但这取决于您。

其作用是执行基本表单的动态子类,将作为 attrs 传入的属性添加到类定义中。因此,当您使用发布数据创建实例时,它们应该正确映射。

编辑:

我更仔细地阅读了这个问题。您需要做的是确保动态输入元素的命名正确,并且值到达 django 后会映射到这些字段名称。否则,request.POST 将无法正确填写表单。

<input type='text' name='fieldname_1' value='value_for_field_1' /> 
Run Code Online (Sandbox Code Playgroud)

ETC