我在我的模板中放了一些客户端Javascript,允许用户动态地向表单添加字段。我的问题是这些字段在form.cleaned_data
中被清除,所以我无法以这种方式访问它们。
所有字段都可以在request.POST
中访问,所以我可以用这个解决这个问题,但我想以“正确的方式”做到这一点,我认为解决方案在于使用django表单而不是直接阅读请求。
我尝试覆盖form.clean()
,但似乎数据在到达时已经消失了。
其他详细信息:我将这些字段命名为fieldname_x
,其中x
是一个数字。在request.POST
中,request.POST['fieldname']
是所有值的列表,但form.cleaned_data
仅包含每个列表的最后一个值。
答案 0 :(得分: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)
您提交的表单现在应包含您需要的所有字段及其值。您可能希望删除required = False,但这取决于您。
这样做,是执行基本表单的动态子类,将作为attrs传递的属性添加到类定义中。因此,当您使用发布数据创建实例时,应正确映射它们。
编辑:
我更仔细地阅读了这个问题。您要做的是确保正确命名动态输入元素,并且一旦到达django,值将映射到这些字段名。否则,request.POST将无法正确填写表单。
<input type='text' name='fieldname_1' value='value_for_field_1' />
等
答案 1 :(得分:2)
也可以在表单文件中完成这项工作,这是Jacob Kaplan-Mosse对动态表单的极好演示:http://jacobian.org/writing/dynamic-form-generation/非常适用于此问题。
所做的是为表单添加一个方法,添加额外的动态字段,然后从clean中生成信息,以便在视图中获取它。
class MyForm(forms.Form):
text = forms.CharField(max_length=30)
def __init__(self, *args, **kwargs):
extra = kwargs.pop('extra')
super(MyForm, self).__init__(*args, **kwargs)
for i, question in enumerate(extra):
self.fields['fieldname_%s' % i] = forms.CharField(label=question)
def extra_fields(self):
for name, value in self.cleaned_data.items():
if name.startswith('fieldname_'):
yield (self.fields[name].label, value)
并从视图中调用它:
def doSomething(request, extra_fields):
form = MyForm(request.POST or None, extra=extra_fields)
if form.is_valid():
for (question, answer) in form.extra_answers():
save_answer(request, question, answer)
return redirect("create_user_success")
return render_to_response("template/form.html", {'form': form})
非常整洁,恭喜Jacob Kaplan-Moss
答案 2 :(得分:0)
我正在我正在进行的项目中这样做。你想看一下formset。但要注意,它并不漂亮。你必须修改存储到表单计数的这个愚蠢的隐藏字段,你必须正确地重命名输入..这涉及很多无意义的字符串解析。如果他们使用数组,比如PHP,就不会有问题,但是他们一心想让我的生活变得悲惨...... rambles off
修改强> http://docs.djangoproject.com/en/dev/topics/forms/formsets/#empty-form他们提供了这个让你的生活减少5%的痛苦......你可以在前缀上找到并替换相应的数字..但我想我有一个问题如果使用post数据初始化表单,则空表单不包含正确的默认值,因此我必须创建一个没有发布数据的第二个实例到一个实际为空的empty_form,这只是一个延迟。