Flask中QuerySelectField基于数据库ID设置默认值失败求助
问题原因
QuerySelectField 要求选中值必须是对应数据库模型的实例对象,而非单纯的ID数值。你当前直接将仓库ID赋值给form.fboWarehouseFrom.default,字段无法将ID映射到对应的模型实例,因此默认选中不生效。
解决方案
- 通过ID从数据库查询出对应的
ozonWarehouse实例 - 将实例直接赋值给字段的
data属性(推荐,逻辑更直接);或设置default后调用form.process()应用默认值
修改后的路由代码片段
@app.route('/ozon-unit-economy', methods=['GET', 'POST']) def ozonUnitEconomy(): ozonProductId = request.args.get('id') productData = dict() form = ozonUnitEcForm() if form.validate_on_submit(): productData = func.loadOzonProdUEData(form, None, ozonProductId) calcResults, miscData, currentDate = func.calcOzonUnitEconomy(productData, form.date.data) else: productData = func.loadOzonProdUEData(None, None, ozonProductId) calcResults, miscData, currentDate = func.calcOzonUnitEconomy(productData, date.today()) ... # 获取仓库ID并查询对应实例 warehouse_id = productData['fboWarehouseFrom'] default_warehouse = ozonWarehouse.query.get(warehouse_id) # 直接赋值给字段的data属性 if default_warehouse: # 避免ID不存在导致报错 form.fboWarehouseFrom.data = default_warehouse ... return render_template('ozon-unit-economy.html', title='Юнит-экономика товара Ozon', form=form, productData = productData, miscData = miscData, calcResults = calcResults)
补充说明
- 如果坚持使用
default属性,需在设置default后调用form.process(),注意调用时机:必须在设置完所有默认值之后,且不能在表单已处理请求数据之后调用。示例:form.fboWarehouseFrom.default = default_warehouse form.process() # 应用默认值 - 增加
if default_warehouse:判断,是为了防止数据库中不存在对应ID的仓库时,出现None赋值导致的异常。
内容的提问来源于stack exchange,提问作者Павел
相关产品推荐
相关产品推荐

