Flask-Admin with mongoengine - 如何在视图上设置“持久过滤器”?
Flask-Admin with mongoengine - how to set a “persistent filter” on a view?
我尝试将 Flask-Admin 与 Mongoengine 一起使用,但我完全被卡住了。我找不到实现“持久性过滤器”的解决方案。我的意思是,用户应该只看到视图(列表)中的项目并与之交互,这些项目是由 mongoengine 中的自定义查询产生的。
如果我有模型
class User(Document):
name = StringField()
days = DecimalField()
book = StringField()
我只想在第一个视图中显示特定用户的书籍,我会做一个查询:
user_peter = User.objects(name=’Peter’)
如果我想为 Peter 显示过期书籍,我会进行查询:
overdue_books = User.objects(name=’Peter’, days__gt=28)
如何在自定义的 flask-admin-view 中实现它?我必须在 ModelView 中设置什么?
Class LentBooks(ModelView):
menu_class_name=”Your Books”
#???
Class OverdueBooks(ModelView):
menu_class_name=”Overdue Books”
#???
还是我必须把它放在这里?
Admin.add_view(LentBooks(model=User, #???))
对于SQLAlchemy,有很多配方,但对于mongoengine 则没有。请帮忙!
我发现的是 flask_admin.contrib.mongoengine.filters
class FilterEqual(BaseMongoEngineFilter):
def apply(self, query, value):
flt = {'%s' % self.column.name: value}
return query.filter(**flt)
def operation(self):
return lazy_gettext('equals')
但是如何实现呢??
谢谢 pjcunningham!!
这是 pjcunningham 在一个小型测试源中的解决方案:
from flask import Flask
import flask_admin as admin
from flask_mongoengine import MongoEngine
from flask_admin.contrib.mongoengine import ModelView
app = Flask(__name__)
app.config['SECRET_KEY'] = '1234567890'
app.config['MONGODB_SETTINGS'] = {'db': 'library'}
db = MongoEngine()
db.init_app(app)
class User(db.Document):
name = db.StringField()
days = db.DecimalField()
book = db.StringField()
class OverdueBooks(ModelView):
def get_query(self):
overdue_books = User.objects(name='Peter', days__gt=28)
return overdue_books
if __name__ == '__main__':
admin = admin.Admin(app, 'Example: Library')
admin.add_view(OverdueBooks(model=User, name='Library'))
app.run(debug=True)
在MongoDB中:
{ "_id" : ObjectId("5815f403e198515188860e3c"), "name" : "Jane", "days" : 21, "book" : "Testbook1" }
{ "_id" : ObjectId("5815f416e198515188860e3d"), "name" : "Peter", "days" : 30, "book" : "Testbook2" }
非常感谢!有效!
在您的视图中覆盖 get_query
。例如
class OverdueBooks(ModelView):
def get_query(self):
overdue_books = User.objects(name=’Peter’, days__gt=28)
return overdue_books
我尝试将 Flask-Admin 与 Mongoengine 一起使用,但我完全被卡住了。我找不到实现“持久性过滤器”的解决方案。我的意思是,用户应该只看到视图(列表)中的项目并与之交互,这些项目是由 mongoengine 中的自定义查询产生的。
如果我有模型
class User(Document):
name = StringField()
days = DecimalField()
book = StringField()
我只想在第一个视图中显示特定用户的书籍,我会做一个查询:
user_peter = User.objects(name=’Peter’)
如果我想为 Peter 显示过期书籍,我会进行查询:
overdue_books = User.objects(name=’Peter’, days__gt=28)
如何在自定义的 flask-admin-view 中实现它?我必须在 ModelView 中设置什么?
Class LentBooks(ModelView):
menu_class_name=”Your Books”
#???
Class OverdueBooks(ModelView):
menu_class_name=”Overdue Books”
#???
还是我必须把它放在这里?
Admin.add_view(LentBooks(model=User, #???))
对于SQLAlchemy,有很多配方,但对于mongoengine 则没有。请帮忙!
我发现的是 flask_admin.contrib.mongoengine.filters
class FilterEqual(BaseMongoEngineFilter):
def apply(self, query, value):
flt = {'%s' % self.column.name: value}
return query.filter(**flt)
def operation(self):
return lazy_gettext('equals')
但是如何实现呢??
谢谢 pjcunningham!!
这是 pjcunningham 在一个小型测试源中的解决方案:
from flask import Flask
import flask_admin as admin
from flask_mongoengine import MongoEngine
from flask_admin.contrib.mongoengine import ModelView
app = Flask(__name__)
app.config['SECRET_KEY'] = '1234567890'
app.config['MONGODB_SETTINGS'] = {'db': 'library'}
db = MongoEngine()
db.init_app(app)
class User(db.Document):
name = db.StringField()
days = db.DecimalField()
book = db.StringField()
class OverdueBooks(ModelView):
def get_query(self):
overdue_books = User.objects(name='Peter', days__gt=28)
return overdue_books
if __name__ == '__main__':
admin = admin.Admin(app, 'Example: Library')
admin.add_view(OverdueBooks(model=User, name='Library'))
app.run(debug=True)
在MongoDB中:
{ "_id" : ObjectId("5815f403e198515188860e3c"), "name" : "Jane", "days" : 21, "book" : "Testbook1" }
{ "_id" : ObjectId("5815f416e198515188860e3d"), "name" : "Peter", "days" : 30, "book" : "Testbook2" }
非常感谢!有效!
在您的视图中覆盖 get_query
。例如
class OverdueBooks(ModelView):
def get_query(self):
overdue_books = User.objects(name=’Peter’, days__gt=28)
return overdue_books