【问题标题】:Flask-Admin default filtersFlask-Admin 默认过滤器
【发布时间】:2022-01-01 03:47:21
【问题描述】:

我想在我的 Flask-Admin 模型列表视图中只显示已付款的订单。

这里是models.py:

class Order(db.Model):
   id = db.Column(db.Integer, primary_key=True)
   amount = db.Column(db.Integer)
   description = db.Column(db.String)
   paid = db.Column(db.Boolean, default=False)

这是 Flask-Admin 的 ModelView:

class OrderView(ModelView):
    column_filters = ("paid")


admin.add_view(OrderView(Order, db.session))

过滤器工作正常,但我想将此过滤器设为默认值。或者更好的是,不要使用过滤器,只显示 Order.query.filter(Order.paid==True) 查询输出的订单。

可以用 Flask-Admin 做吗?

【问题讨论】:

    标签: python flask flask-admin


    【解决方案1】:

    我们在我们的应用中通过覆盖 ModelView 来做到这一点。

    https://github.com/mrjoes/flask-admin/blob/master/flask_admin/contrib/sqla/view.py#L654

    我浏览了 Flask-Admin 的源代码,自从我们上次编辑此代码以来,他们使 API 更易于使用,因为看起来你可以这样做:

    from flask.ext.admin.contrib.sqla.view import ModelView, func
    
    class PaidOrderView(ModelVew):
        def get_query(self):
          return self.session.query(self.model).filter(self.model.paid==True)
    
        def get_count_query(self):
          return self.session.query(func.count('*')).filter(self.model.paid==True)
    

    (我们重写了 get_list() ,这几乎没有那么好。)

    然后你可以像这样使用它:

    admin.add_view(PaidOrderView(Order, db.session))
    

    如果这对你不起作用,请告诉我,我可以再看看。

    【讨论】:

    • 效果很好,非常感谢!虽然我不得不将查询计数函数更改为 "def get_count_query(self): return self.session.query(func.count('*')).filter(Order.paid==True)" ,否则会出错,关于 Int 对象没有标量属性 :)
    • 太棒了,我很高兴!
    • @RachelSanders:更新了您的答案以包含用户的评论,希望没问题。感谢您研究这个,它真的帮助了我!
    • @RachelSanders 由于您似乎是烧瓶管理员专业人士:以防万一您知道答案,我开始对this question 进行赏金。 :)
    • 对于经过的 Flask mongo dev,值得一提的是,如果您使用 Pymongo 代替,那么您可以覆盖您的 get_list 函数并在那里调整过滤器参数。
    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 2012-05-11
    • 1970-01-01
    • 2013-08-16
    • 2012-10-15
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多