Flask-admin editable select column row-based filter
Flask-admin editable select column row-based filter
我正在使用 flask-admin 来轻松编辑我的数据库模型。就是把雪具出租给客户。
这是我的租赁视图(sql_alchemy 数据库模型是相应的):
class RentalView(ModelView):
column_list = ("customer", "from_date", "to_date", "ski", "remarks")
...
客户和滑雪是各自模型的关系字段。我只想在编辑视图中显示这段时间内没有被其他人租用的滑雪板。
我一直在到处寻找如何动态设置编辑表单的选项,但它根本无法正常工作。
我试过
def on_form_prefill(self, form, id):
query = db.session.query... # do the query based on the rental "id"
form.ski.query = query
这正确显示了过滤后的查询。但是,在提交表单时,QuerySelectField ski
的 .query
属性再次为 None
,因此导致 query = self.query or self.query_factory() TypeError: 'NoneType' object is not callable
错误。不知道为什么要重置查询?!
有人知道根据编辑对象的 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
我正在使用 flask-admin 来轻松编辑我的数据库模型。就是把雪具出租给客户。
这是我的租赁视图(sql_alchemy 数据库模型是相应的):
class RentalView(ModelView):
column_list = ("customer", "from_date", "to_date", "ski", "remarks")
...
客户和滑雪是各自模型的关系字段。我只想在编辑视图中显示这段时间内没有被其他人租用的滑雪板。
我一直在到处寻找如何动态设置编辑表单的选项,但它根本无法正常工作。
我试过
def on_form_prefill(self, form, id):
query = db.session.query... # do the query based on the rental "id"
form.ski.query = query
这正确显示了过滤后的查询。但是,在提交表单时,QuerySelectField ski
的 .query
属性再次为 None
,因此导致 query = self.query or self.query_factory() TypeError: 'NoneType' object is not callable
错误。不知道为什么要重置查询?!
有人知道根据编辑对象的 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