我使用的是文档中建议的自定义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,则所有复选框都将取消勾选。
我做错了什么?
发布于 2015-12-30 07:08:43
如果你看一下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]https://stackoverflow.com/questions/34415991
复制相似问题