如何在 Flask-Admin 中显示角色与用户的关系?

Posted

技术标签:

【中文标题】如何在 Flask-Admin 中显示角色与用户的关系?【英文标题】:How to show roles-to-users relations in Flask-Admin? 【发布时间】:2017-08-03 22:45:03 【问题描述】:

所以我创建了一个具有多个角色和数据结构的基本 Flask-User 应用程序,如下所示:

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    active = db.Column('is_active', db.Boolean(), nullable=False, server_default='0')
    first_name = db.Column(db.String(50), nullable=False, default='')
    last_name = db.Column(db.String(50), nullable=False, default='')
    email = db.Column(db.String(255), nullable=False, unique=True)
    confirmed_at = db.Column(db.DateTime())
    # Relationships
    user_auth = db.relationship('UserAuth', uselist=False)
    roles = db.relationship('Role', secondary='user_roles',
            backref=db.backref('users', lazy='dynamic'))

    def is_active(self):
        return self.active

class UserAuth(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))

    # User authentication information
    username = db.Column(db.String(50), nullable=False, unique=True)
    password = db.Column(db.String(255), nullable=False, default='')

    # Relationships
    user = db.relationship('User', uselist=False)

    def hash_password(self, password):
        self.password_hash = pwd_context.encrypt(password)

    def verify_password(self, password):
        return pwd_context.verify(password, self.password_hash)

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

class UserRoles(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
    role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))

我尝试在 Flask-Admin 中显示它:

class AdminView(ModelView):
    def is_accessible(self):
        access = current_user.is_authenticated and current_user.has_role('admin')
        return access

admin = Admin(app, name='My Admin', template_mode='bootstrap3')
admin.add_view(AdminView(User, db.session))
admin.add_view(AdminView(UserAuth, db.session))
admin.add_view(AdminView(Role, db.session))
admin.add_view(AdminView(UserRoles, db.session))

为什么它以如此奇怪的方式显示:

以及在编辑用户时如何查看和能够编辑用户角色?

【问题讨论】:

在我看来,您返回的是对象,而不是属性。 【参考方案1】:

您尚未为UserAuth 类的实例定义合适的字符串表示形式。一个合适的例子是:

class UserAuth(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))

    # User authentication information
    username = db.Column(db.String(50), nullable=False, unique=True)
    password = db.Column(db.String(255), nullable=False, default='')

    # Relationships
    user = db.relationship('User', uselist=False)

    def hash_password(self, password):
        self.password_hash = pwd_context.encrypt(password)

    def verify_password(self, password):
        return pwd_context.verify(password, self.password_hash)

    def __str__(self):
        return unicode(self).encode('utf-8')

    def __unicode__(self):
        return self.username

您的所有模型都需要这样做。

【讨论】:

将角色显示为字符串列表,将column_auto_select_related = True 添加到View__str____hash__Role 类对我来说就足够了。

以上是关于如何在 Flask-Admin 中显示角色与用户的关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flask-Admin 中显示参考字段的实际字段?

Flask-Admin 在代理关联中添加新关键字

如何将 Flask-Admin 中的某些字段动态替换为 Select2?

使用flask-admin,如何获得支持不存在标签的标签字段?

如何在drupal 7视图中按角色和用户ID显示用户评论

flask-admin,自定义视图参数设置。