Flask 管理员可编辑用户更改他们的数据

Flask Admin edit able user change their data

我正在使用 Flask-Admin 来管理我的 CRUD。 我的应用程序中有三个角色,分别是 superuseroperatorclient.

在这个应用程序中,操作员必须要求超级用户注册他们的帐户,更改他们的数据和其他。

但是对于不计其数的客户,我希望他们可以注册他们的账户或者自己编辑他们的账户信息。

目前,客户可以自己注册,但现在我希望客户可以在不通过超级用户的情况下单独编辑他们的信息。

到目前为止,我只能通过超级用户编辑账户信息,就像这个截图:

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

这是我的模型的片段:

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..?

Flask-Security 带有内置表单和密码更改视图。我会推荐使用它。 https://pythonhosted.org/Flask-Security/customizing.html

要通过 Flask-Admin 视图编辑用户信息,您可以通过执行以下操作来覆盖这些方法。不要忘记在您的 flask-admin 用户 class 中添加 'client' 作为已接受的角色。 自定义过滤器必须过滤 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。