问题描述
我正在尝试使用Flask,WTForms和Jinja构建一个屏幕。它将显示一个递归结构,其中每个级别可以是一个表单 OR 或一组表单。为了便于说明,假设我要显示的表单称为 ChildForm 。我希望代表这种结构...
[ChildForm,ChildForm,[ChildForm,ChildForm],ChildForm]
尽管它可能会更深入。
我的表单的简化版本如下所示(现在,尽管我已经尝试了很多方法来解决这个问题)...
class ChildForm(FlaskForm):
table = SelectField(label='Table Column')
comparator = StringField(label='Equals',default='=')
golden_set = SelectField(label='Golden Set Column')
btn_add_rule = SubmitField(label='Add Rule')
btn_delete_rule = SubmitField(label='Delete Rule')
class ParentForm(FlaskForm):
tbl_name = HiddenField(label='Table Name')
rules = []
btn_save = SubmitField(label='Save')
btn_cancel = SubmitField(label='Cancel')
因此,ParentForm.rules当前是一个Python列表。我希望用ChildForm的实例和/或包含多个ChildForm实例的列表来填充。这种结构的问题在于Jinja2在迭代ParentForm中的字段时会跳过规则。
我尝试将规则更改为包含实例ChildForm的FieldList类型,并使用WTForms .append_entry方法添加新实例,但是,这似乎不允许我创建规则的子列表。 / p>
关于如何使这种有时是递归结构的任何想法?谢谢!
解决方法
我在这里不能肯定地说,但我觉得这些“现场防护罩”可以使您更接近要执行的操作:https://wtforms.readthedocs.io/en/2.3.x/fields/#field-enclosures
FieldList
也可能很重要。
我认为您必须使实际的数据输入表单成为基类,然后父类才能继承它,并具有引用它的附件的字段列表。
class ChildForm(FlaskForm):
table = SelectField(label='Table Column')
comparator = StringField(label='Equals',default='=')
golden_set = SelectField(label='Golden Set Column')
btn_add_rule = SubmitField(label='Add Rule')
btn_delete_rule = SubmitField(label='Delete Rule')
class ParentForm(ChildForm):
tbl_name = HiddenField(label='Table Name')
rules = FieldList(FormField(ChildForm)))
btn_save = SubmitField(label='Save')
btn_cancel = SubmitField(label='Cancel')
那是我在想的一个非常粗略的草图。我不知道是否行得通。我没有尝试运行它。