2014-10-13 12 views
11

Tôi muốn chỉ hiển thị các đơn đặt hàng có trả tiền trong chế độ xem danh sách mô hình Flask-Admin.Bộ lọc mặc định của Quản trị viên Flask

Đây là 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) 

Đây là ModelView cho Flask-Admin:

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


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

Bộ lọc hoạt động tốt, nhưng tôi muốn thực hiện mặc định bộ lọc này. Hoặc tốt hơn, không sử dụng bộ lọc và chỉ hiển thị các đơn đặt hàng là kết quả của truy vấn Order.query.filter(Order.paid==True).

Có thể thực hiện với Flask-Admin không?

Trả lời

30

Chúng tôi làm điều này trong ứng dụng của chúng tôi bằng cách ghi đè ModelView.

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

Tôi nhìn qua mã nguồn một chút cho Flask-Admin, và họ đã thực hiện các API dễ dàng hơn để sử dụng vì chúng ta cuối cùng sửa mã này vì có vẻ như bạn chỉ có thể làm:

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) 

(Chúng tôi đã trọng get_list() mà không phải là gần như là tuyệt vời.)

sau đó bạn có thể sử dụng nó như:

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

Hãy cho tôi biết nếu điều đó không hiệu quả với bạn và tôi có thể xem xét lại.

+2

Nó hoạt động tuyệt vời, cảm ơn bạn rất nhiều! Mặc dù tôi đã phải thay đổi chức năng đếm truy vấn thành "def get_count_query (self): trả về self.session.query (func.count ('*')). Filter (Order.paid == True)", nếu không nó đã đưa ra một lỗi , một cái gì đó về đối tượng Int không có thuộc tính vô hướng :) – user2672932

+0

Tuyệt vời, tôi rất vui! –

+1

@RachelSanders: Cập nhật câu trả lời của bạn để bao gồm nhận xét của người dùng, hy vọng điều đó là OK. Cảm ơn bạn đã nghiên cứu về điều này, nó thực sự đã giúp tôi! –

Các vấn đề liên quan