flask - 需要 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示例吗?该表单应允许用户添加其他子项并对其进行编辑,而不是简单地将父项与现有子项关联。
解决方案
我终于想出了一个不觉得笨拙的解决方案。完整的仓库(仍然非常空闲)在这里: 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)
推荐阅读
- google-earth-engine - 错误:.select(...).sampleRegions 不是函数 - 如何解决?
- matplotlib - Matplotlib:带标记的等高线图线样式
- html - 引导菜单卡住
- .net - 获取内部站点以使用 Azure 应用代理
- c# - 如何取消配置部分项的前缀?
- react-native - React Native 中的 Jest 和异步存储
- c - 我在 C 中创建了一个推送和弹出函数,但不知道如何按顺序打印它们
- dynamics-crm-365 - CRM365:图像确实显示在统一接口的列中
- gradle - 如何在 settings.gradle 文件中声明构建脚本、依赖项和插件?
- docker - 提取用于创建 docker 组件的命令