如何使用Flask-admin按ID分隔视图模型?

时间:2019-01-25 09:53:29

标签: python flask flask-sqlalchemy flask-login flask-admin

我使用 Flask 制作了一个学费支付应用程序,并使用 Flask-admin 作为每个使用我的应用程序注册的学校的数据库管理。

我已经做到了,但是现在我真的不确定如何在已注册以管理自己学费的每个学校帐户之间分隔数据访问。

使用烧瓶登录,我可以使用以下代码进行操作:

@app.route('/school_admin')
@login_required
def school_admin():
    school_data = db.session.query(Student.id, Student.name).filter_by(school_id=current_user.id).all()
    return render_template('school_admin_dashboard.html', school_data=school_data)

但是,由于 Flask-admin 是自动生成的表格视图,因此我真的不知道该怎么做。

到目前为止,我已经将我的 ModelView 设置为:

class SchoolAdminModelView(sqla.ModelView):
    def is_accessible(self):
        if not current_user.is_active or not current_user.is_authenticated:
            return False
        if current_user.has_role('schooladmin'):
            return True

        return False

    def _handle_view(self, name, **kwargs):
        if not self.is_accessible():
            if current_user.is_authenticated:
                # permission denied
                abort(403)
            else:
                # login
                return redirect(url_for('security.login', next=request.url))

class StudentModelView(SchoolAdminModelView):
    pass

admin.add_view(StudentModelView(Student, db.session))

那么,如何通过 school_id ..分隔视图模型??

注意:我之所以选择学校管理员使用 Flask-admin 而不是 Flask-login ,是因为它非常易于管理用户超级用户角色。 我已经使用 Flask登录给使用该应用程序的用户的学生家长。

2 个答案:

答案 0 :(得分:1)

假设已登录的用户连接了school_id

class SchoolAdminModelView(sqla.ModelView):
    def get_query(self):
        return super(SchoolAdminModelView, self).get_query().filter(School.id == current_user.school_id)

它过滤查询,该查询用于生成表中的项目列表。您可能需要根据实际需要对其进行一些调整。

答案 1 :(得分:0)

您的代码几乎可以在@Joost上工作,但是我在其中添加了一些方法。

我已经找到了解决方法here并对其进行了一些修改,这是该代码如何使用以下方法分隔不同学校之间的数据访问:

class StudentModelView(sqla.ModelView):
    def get_query(self):
        return Student.query.filter_by(school_id=current_user.id)

    def get_count_query(self):
        return self.session.query(func.count('*')).select_from(self.model).filter(
            Student.school_id == current_user.id
        )