【问题标题】:Flask-admin editable select column row-based filterFlask-admin 可编辑的选择列基于行的过滤器
【发布时间】:2020-09-24 11:15:20
【问题描述】:

我正在使用 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 ski.query 属性再次变为None,从而导致 query = self.query or self.query_factory() TypeError: 'NoneType' object is not callable 错误。不知道为什么要重置查询?!

有没有人知道如何根据编辑对象的 id 来处理动态查询的不同策略?

【问题讨论】:

    标签: flask flask-sqlalchemy flask-admin


    【解决方案1】:

    使用此模式,覆盖视图的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
    

    【讨论】:

    • 谢谢!这工作得很好,但我想我也试过了。我猜调试的魔力。问题是 on_form_prefill 仅在创建期间调用,一个 GET 请求,所以当表单发布时,query_factory 没有设置,这会导致错误(即使它不是真正需要的,因为我们在帖子上关心的是选定的数据)。
    猜你喜欢
    • 2020-12-29
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2019-02-17
    • 2022-01-01
    • 1970-01-01
    • 2013-05-25
    相关资源
    最近更新 更多