在到达用户之前过滤 Flask Admin 中的下拉菜单

Filtering the Drop Downs in Flask Admin Before it Gets to the User

我正在为不同的公司实现一个接口,以使用相同的 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
        )

和模型

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
    )

谢谢

在深入研究源代码后,我发现了这条有趣的线,它让我找到了正确的答案 https://github.com/flask-admin/flask-admin/blob/0f9f4b8695e3a7d00d9f3bae5fbf8f47f6a24e55/flask_admin/contrib/sqla/form.py#L81

QuerySelectMultipleField 表单字段有一个名为 query_factory 的字段,它接受一个函数。所以我们可以用 form_argslambda:

覆盖它
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
        )