问题描述
我正在使用flask-admin对我的数据库模型进行轻松的编辑。这是关于将滑雪板出租给客户的。
这是我的租借视图(因此是sql_alchemy DB模型):
class RentalView(ModelView):
column_list = ("customer","from_date","to_date","ski","remarks")
...
customer和ski是各自模型的关系字段。我只想在此时间段内未由其他人租用的滑雪板上显示这些滑雪板。
我一直在到处搜索如何动态设置编辑表单的选择,但是它不能完全起作用。
我尝试做
def on_form_prefill(self,form,id):
query = db.session.query... # do the query based on the rental "id"
form.ski.query = query
,并且可以正确显示过滤的查询。但是,在提交表单时,QuerySelectField .query
的{{1}}属性再次为ski
,因此导致None
错误。不知道为什么要重置查询?!
有人知道基于已编辑对象的ID来处理动态查询的另一种策略吗?
解决方法
使用此模式,覆盖视图的edit_form
方法,实例默认编辑表单(通过调用super()
方法,然后根据需要修改表单:
class RentalView(ModelView):
# setup edit forms so that Ski relationship is filtered
def edit_form(self,obj):
# obj is the rental instance being edited
_edit_form = super(RentalView,self).edit_form(obj)
# setup your dynamic query here based on obj.id
# for example
_edit_form.ski.query_factory = lambda: Ski.query.filter(Ski.rental_id == obj.id).all()
return _edit_form