【问题标题】:How to separate views model by id with Flask-admin?如何使用 Flask-admin 按 id 分隔视图模型?
【发布时间】:2019-01-25 09:53:28
【问题描述】:

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

我已经做到了,但现在我真的不知道如何在每个注册管理自己的学费支付的学校帐户之间分离数据访问。

使用 Flask-login,我可以使用以下代码:

@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-login 作为使用此应用程序的用户的学生的家长。

【问题讨论】:

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


    【解决方案1】:

    假设登录用户有一个school_id 连接到他们:

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

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

    【讨论】:

    • 当前用户是否登录? current_user 是否显示正常 app.routes 的内容?
    【解决方案2】:

    @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
            )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2015-09-16
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多