SelectMultipleField上数据属性的正确格式是什么

时间:2015-12-22 12:31:03

标签: wtforms

我使用文档中建议的自定义SelectMultipleField。

我可以完美地设置选项,但是我在设置正确的数据属性格式时遇到了麻烦。

    class MultiCheckboxField(SelectMultipleField):
        """
        A multiple-select, except displays a list of checkboxes.

        Iterating the field will produce subfields, allowing custom rendering of
        the enclosed checkbox fields.
        """
        widget = widgets.ListWidget(prefix_label=False)
        option_widget = widgets.CheckboxInput()

我然后使用:

        plist = MultiCheckBoxField(coerce=bool, choices=[('1', '1') ... ])

我认为.data会是[True,False,False]值的列表,与coerce = Bool相结合,但我的结果很奇怪。

第一个值被读取为所有复选框的值。因此,如果列表中的第一个值为True,则它们都为true,如果第一个值为False,则所有复选框都未被取消。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

如果你看一下wtforms的来源,就会发生这种情况。

def process_data(self, value):
    try:
        self.data = list(self.coerce(v) for v in value)
    except (ValueError, TypeError):
        self.data = None

所以它不是“填写”其他值,它只是强制传递给表单的值数组。

如果您希望以不同的方式处理数据,请覆盖此方法。

import wtforms

class MultiCheckboxField(wtforms.SelectMultipleField):
    widget = wtforms.widgets.ListWidget(prefix_label=False)
    option_widget = wtforms.widgets.CheckboxInput()

    def process_data(self, value):
        try:
            self.data = []

            for choice_value, choice_label in self.choices:
                if choice_value in value:
                    self.data.append(True)
                else:
                    self.data.append(False)
        except:
            self.data = None

class SomeForm(wtforms.Form):
    multi = MultiCheckboxField('', choices=[('val1', 'label'), ('val2', 'label2')], coerce=bool)

f = SomeForm(data={'multi': ['val2']})

>>> f.multi.data
[False, True]