首页 > 解决方案 > 需要 SQLAlchemy WTForms Flask 将子级附加到父表单示例

问题描述

虽然在 https://wtforms.readthedocs.io/en/stable/ 有 WTForms 的文档,并且在https://wtforms-alchemy.readthedocs.io/en/latest/有 WTForms-Alchemy的文档,但文档确实可以通过包含一些示例来改进,因为它们将使用 Flask 实现。我面临的一个挑战是创建一个简单的表单,允许用户更新父对象的父对象和子对象。另外两篇 StackOverflow 帖子解决了这一挑战。第一个(这是我自己的,位于 当使用 wtforms 和 sqlalchemy 时,具有父子关系的表单会将新子级附加到数据库而不是更新现有子级) 是完整的,但包含了我怀疑的东西。第二个很好,但没有显示如何将表单保存在烧瓶中: 使用 AJAX 使用 Flask-WTForms 将条目附加到 FieldList。有人知道更新父对象及其子对象的表单的完整且正确的工作flask-sqlalchemy-wtforms示例吗?该表单应允许用户添加其他子项并对其进行编辑,而不是简单地将父项与现有子项关联。

标签: flasksqlalchemywtforms

解决方案


我终于想出了一个不觉得笨拙的解决方案。完整的仓库(仍然非常空闲)在这里: https ://github.com/lfernandez55/3200_wtf_parent_child_example 。下面是 update_registration 视图,详细说明了表单信息如何在更新中持久保存:

@app.route('/update_registration', methods=['GET', 'POST'])
def update_registration():
    parentObj = Parent.query.filter(Parent.id == 1).first()
    form = ParentForm(id=parentObj.id, name=parentObj.name, children=parentObj.children)

    if form.add_child.data:
        form.children.append_entry()
        return render_template('update_registration.html', form=form)
    if form.remove_child.data:
        popped_entry = form.children.pop_entry()
        child = Child.query.filter(Child.id == popped_entry.data['id']).first()
        db.session.delete(child)
        db.session.commit()
        return render_template('update_registration.html', form=form)
    if form.validate_on_submit():
        for child in form.children.data:
            if child['id'] != "":
                childObj = Child.query.filter(Child.id == child['id']).first()
                childObj.name=child['name']
                childObj.age=child['age']
            else:
                childObj = Child(name=child['name'],age=child['age'])
            parentObj.children.append(childObj)
        db.session.add(parentObj)
        db.session.commit()
        flash('Parent [and children] Updated!!')
        return redirect(url_for('home_page'))
    return render_template('update_registration.html', form=form)

推荐阅读