我使用文档中建议的自定义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,则所有复选框都未被取消。
我做错了什么?
答案 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]