在form.cleaned中删除动态添加的表单域

我在我的模板中放置了一些客户端Javascript,允许用户动态添加字段到表单。 我的问题是,这些字段在form.cleaned_data中清理,所以我不能以这种方式访问​​它们。

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

我试图覆盖form.clean() ,但它看起来像数据已经到了那里。

其他细节:我将这些字段命名为fieldname_x ,其中x是一个数字。 在request.POSTrequest.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

下一篇: Tesseract or any other OCR lib