【问题标题】:Recursion with WTForms and Jinja使用 WTForms 和 Jinja 进行递归
【发布时间】:2020-11-30 13:08:52
【问题描述】:

我正在尝试使用 Flask、WTForms 和 Jinja 构建屏幕。它将显示一个递归结构,其中每个级别可以是一个表单一组表单。出于解释的目的,假设我要显示的表单称为 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 中的字段时会跳过 rules

我尝试将 rules 更改为包含 ChildForm 实例的 FieldList 类型,使用 WTForms .append_entry 方法添加新实例,但是,这似乎不允许我创建规则子列表。

关于如何制作这种有时是递归结构的任何想法?谢谢!

【问题讨论】:

    标签: flask jinja2 flask-wtforms wtforms


    【解决方案1】:

    我不能在这里肯定地说,但我觉得这些 Field Enclosure 会让你更接近你想要做的事情: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')
    

    这是我所想的一个非常粗略的草图。我不知道它是否会起作用。我还没有尝试运行它。

    【讨论】:

    • 感谢您考虑这个问题,迈克。不过,我不确定它是否对我有用,因为我看不到将子列表放入 FieldList 的方法。我想我可以通过 WTForms-JSON 得到我需要的东西,因为它似乎支持递归结构。如果我能让它工作,我会在这里发布答案。再次感谢!
    • 是的,我明白你在说什么。真可惜。祝你好运!
    猜你喜欢
    • 2016-06-16
    • 2011-06-04
    • 2018-11-02
    • 2015-02-02
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多