使用WTForms和Jinja进行递归

问题描述

我正在尝试使用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')

那是我在想的一个非常粗略的草图。我不知道是否行得通。我没有尝试运行它。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...