在form.cleaned中删除动态添加的表单域
我在我的模板中放置了一些客户端Javascript,允许用户动态添加字段到表单。 我的问题是,这些字段在form.cleaned_data
中清理,所以我不能以这种方式访问它们。
所有的字段都可以通过request.POST
访问,所以我可以用这个来解决这个问题,但是我想这样做是“正确的方式”,我认为解决方案在于使用django表单而不是直接读取请求。
我试图覆盖form.clean()
,但它看起来像数据已经到了那里。
其他细节:我将这些字段命名为fieldname_x
,其中x
是一个数字。 在request.POST
, request.POST['fieldname']
是所有值的列表,但form.cleaned_data
只包含每个列表的最后一个值。
你知道什么类型的这些领域将事先? 他们只是简单的文本字段? 我做了类似的事情,创建了动态表单。
# 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' />
等等
也可以在你的表单文件中完成这项工作,这里是Jacob Kaplan-Mosse对动态表单的一个很好的演示:http://jacobian.org/writing/dynamic-form-generation/,对于这个问题很适用。
所做的是向你的form类添加一个方法,添加额外的动态字段,然后从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
我正在做我正在进行的项目。 你会想看看formsets。 但要警告,这不是很漂亮。 你必须修改这个存储到表单计数的隐藏字段,并且你必须正确地重命名输入。这涉及到很多无意义的字符串解析。 如果他们已经使用过像PHP这样的数组,那就不会有问题了,但是他们会竭尽全力让我的生活变得悲惨...... 匆匆离去
编辑: http : //docs.djangoproject.com/en/dev/topics/forms/formsets/#empty-form他们提供这使你的生活减少5%的痛苦...你可以做一个查找和替换前缀与适当的数字..但我认为我有一个问题,空表单不包含正确的默认值,如果您使用发布数据初始化表单,所以我必须创建第二个实例没有发布数据实际为空empty_form ,这只是迟缓。
链接地址: http://www.djcxy.com/p/49091.html上一篇: Dynamically added form fields are removed in form.cleaned