【问题标题】:Flask-admin: Is it possible to apply filters (which can be disable) to a view/endpoint by defaultFlask-admin:默认情况下是否可以将过滤器(可以禁用)应用于视图/端点
【发布时间】:2022-01-02 18:01:30
【问题描述】:

我想知道如何在访问页面时默认应用过滤器。

我希望能够禁用此过滤器。

下面的一些示例代码:

from flask import Flask
from flask_admin import Admin
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy()
db.init_app(app)

from . import models
from . import views
db.create_all()
admin = Admin(app,
              name='Interface',
              base_template='my_master.html',
              template_mode='bootstrap3',
              url='/')
admin.add_view(views.MyView(models.User, db.session, endpoint='users', url='/users'))

# models
from . import db

class User(db.Model):
    __tablename__ = 'USER'
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String())
    label = db.Column(db.String()) # 2 possible values: True abd False

    def __str__(self):
        return "{}".format(self.name)

# views
from flask_admin.contrib.sqla import ModelView
from flask_admin.contrib.sqla.filters import BaseSQLAFilter

class FilterLabels(BaseSQLAFilter):
    def apply(self, query, value, alias=None):
        if value =='0':
            return query.filter(self.column == 'True')
        if value =='1':
            return query.filter(self.column == 'False')
    def operation(self):
        return u'equals'

    def get_options(self, view):
        return [(0, 'True'), (1, 'False')]

class MyView(ModelView):

    column_list = ('id', 'name', 'label')
    column_searchable_list = column_list 
    column_filters = ['id', 'name', FilterLabels]

    def get_url(self, endpoint, **kwargs):
        return url_for(endpoint, **kwargs) # Should I add something here?

    def is_accessible(self):
        return True

'''

我想要什么?

当我访问页面时,我希望应用过滤器 (FilterLabels)。 我希望轻松禁用此过滤器

你能帮帮我吗?

【问题讨论】:

  • column_default_sort 是一个好的开始,但我不知道如何通过 UI 禁用它
  • “当我第一次访问该页面时” - 您认为什么是“第一次”?
  • 当您使用 Get 方法访问 url 时,例如输入“www.google.com”进行搜索时

标签: flask sqlalchemy flask-admin


【解决方案1】:

您需要在 ModelView 类中更新 get_query 和 get_count_query 函数。

这是一个例子

http://127.0.0.1:5000/admin/post/publish :将过滤我的模型帖子,状态等于发布。

class PostPublishView(ModelView):
    def is_visible(self):
        return False

    def get_query(self):
        return self.session.query(self.model).filter(self.model.status=='publish')

    def get_count_query(self):
        return self.session.query(func.count('*')).filter(self.model.status=='publish')

admin.add_view(PostPublishView(Post, db.session, name="Publish", endpoint='/post/publish'))

或者你可以@expose链接

http://127.0.0.1:5000/admin/post/showpublish

class PostView(ModelView):
     
    @expose("/post/showpublish")
    def showpublish(self):
        return super().index_view()


    def get_query(self):
        return self.session.query(self.model).filter(self.model.status=='publish')

    def get_count_query(self):
        return self.session.query(func.count('*')).filter(self.model.status=='publish')

admin.add_view(PostView(Post, db.session))

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 2019-06-02
    • 2022-01-01
    • 2022-12-07
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多