Jac*_*fer 3 python flask flask-admin
我正在为不同的公司实现一个接口,以使用相同的 Flask Admin 实例为他们的不同用户添加和分配角色。但是,我希望只有属于公司查看数据的用户才会出现在代表角色和用户之间一对多关系的下拉列表中。
是否有类似get_query, 但对于下拉值?
这是我当前的视图代码
class RoleView(ModelView):
def get_query(self):
return super(RoleView, self).get_query().filter(
Role.company_id == current_user.company.id
)
def get_count_query(self):
return super(RoleView, self).get_count_query().filter(
Role.company_id == current_user.company.id
)
Run Code Online (Sandbox Code Playgroud)
和模型
class Role(db.Model):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
users = db.relationship(
'User',
backref="role",
lazy="dynamic"
)
company_id = db.Column(
db.Integer,
db.ForeignKey('company.id'),
nullable=False
)
Run Code Online (Sandbox Code Playgroud)
谢谢
在挖掘源代码后,我发现了这条有趣的线,它使我得到了正确的答案https://github.com/flask-admin/flask-admin/blob/0f9f4b8695e3a7d00d9f3bae5fbf8f47f6a24e55/flask_admin/contrib/sqla/form.py#L81
的QuerySelectMultipleField表单字段有一个称为字段query_factory,它接受的功能。所以我们可以用form_args和 a覆盖它lambda:
class RoleView(ModelView):
column_exclude_list = ['company']
form_excluded_columns = ['company']
form_args = {
'users': {
'query_factory': lambda: User.query.filter_by(
company_id=current_user.company_id
)
}
}
def get_query(self):
return super(RoleView, self).get_query().filter(
Role.company_id == current_user.company.id
)
def get_count_query(self):
return super(RoleView, self).get_count_query().filter(
Role.company_id == current_user.company.id
)
Run Code Online (Sandbox Code Playgroud)