首页 > 解决方案 > WTForms booleanfield 总是返回 True

问题描述

我写了自定义FieldList

    class EventForm(Form):
        enabled = BooleanField()
        user_role = IntegerField()


    class EventsForm(Form):
        user_roles = FieldList(FormField(EventForm))
        section_name = StringField()

class CompanyForm(BaseForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._populate_event_permissions()

        def _populate_event_permissions(self):
        permissions = get_all_event_permissions()
        for event, value in permissions.items():
            form_field = self.event.append_entry(
                data={'section_name': event})
            field_1 = form_field.user_roles.append_entry(
                data={'enabled': True, 'user_role': 8})
            field_1.enabled.label.text = 'Participant'
            field_1.enabled.name = value
            field_2 = form_field.user_roles.append_entry(
                data={'user_role': 9})
            field_2.enabled.label.text = 'Organizer'
            field_2.enabled.name = value
            field_3 = form_field.user_roles.append_entry(
                data={'user_role': 10})
            field_3.enabled.label.text = 'Admin'
            field_3.enabled.name = value

在模板中很好地渲染了它,但是每次我尝试发送它并且复选框False总是True按原样发送时append_entry。这是我检查输入数据的方法。

class MyView(BaseModelView):
    def on_model_change(self, form, model, is_created):
        for section in form.event.entries:
            for entry in section.user_roles.entries:
                print(entry.enabled.data)

看起来default value无论复选框是真还是假,表单总是发送我还定义了表单预填充,如果我手动将数据库中的值设置为 False 它会将输入正确呈现为 False 但是当我再次发送表单时(无论是什么复选框状态是)它将数据库覆盖为True。表单看不到编辑值肯定存在问题。我该如何解决?

标签: flaskflask-wtformswtformsflask-admin

解决方案


您正在表单本身的 init 方法中设置表单字段的值。这可能会覆盖request.form作为加载相关视图的一部分在表单上设置的值。

您应该根据需要填充scaffold_form()create_form()/中的字段edit_form()

class MyView(BaseModelView):
    def scaffold_form(self):
        form = super(MyView, self).scaffold_form()

        permissions = get_all_event_permissions()
        for event, value in permissions.items():
            form_field = self.event.append_entry(data={'section_name': event})
            # etc.

        return form

推荐阅读