Flask管理员可编辑的用户可以更改其数据

时间:2019-03-31 14:48:32

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

我正在使用 Flask-Admin 管理我的CRUD。 我的应用程序中有三个角色,分别是超级用户操作员客户端

在此应用中,操作员必须要求超级用户注册其帐户,更改其数据及其他信息。

但是对于没有编号的客户,我希望他们可以注册自己的帐户或自己编辑帐户信息。

目前,客户端可以自己注册,但是现在我希望客户端可以通过超级用户单独编辑其信息。

到目前为止,我只能由超级用户编辑帐户信息,如以下屏幕截图所示: enter image description here

所以现在,我希望客户可以自己编辑他们的姓名,电子邮件,密码或其他信息,还可以与其他客户分开数据。

这是我的模特的片段:

roles_users = db.Table(
    'roles_users',
    db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)

class Role(db.Model, RoleMixin):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))

class Operator(User):
    __tablename__ = 'operator'
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))


class Client(User):
    __tablename__ = 'client'
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))

那么,如何使用 Flask-Admin ..?

1 个答案:

答案 0 :(得分:1)

Flask-Security带有内置表单,并可以查看密码更改。我建议使用它。 https://pythonhosted.org/Flask-Security/customizing.html

要通过Flask-Admin视图编辑用户信息,您可以执行以下操作来覆盖这些方法。不要忘记在flask-admin User类中添加“客户端”作为接受角色。 自定义过滤器必须根据current_user_id进行过滤,因此无法编辑其他用户配置文件。

def get_query(self) 
    if "superuser" in current_user.roles:
        return self.session.query(self.model)  # as original source code

    else:  # for all other roles
        return self.session.query(self.model).filter(
            < insert custom filter here> )



def get_count_query(self): 
    if "superuser" in current_user.roles:
        return self.session.query(func.count('*')).select_from(self.model) # as original source code

    else: # for all other roles
        return self.session.query(func.count('*')).filter(
            <insert custom filter here>  )

另一种解决方案是构建一个自定义视图(不使用flask-admin),并将其命名为/ myprofile。