如何将 flask-sqlalchemy 的 db.Table 添加到 flask-admin?

how to add db.Table of flask-sqlalchemy to flask-admin?

flask-securityflask-admin 集成时,flask-security 需要创建一个名为 roles_usersdb.Table 为 [=18] 的 table =]:

    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基于flask-sqlalchemydb.Model可以注册到flask-admin如下:

    admin.add_view(ModelView(User, db.session))

查了flask-sqlalchemy的出处,没搞清楚db.Tabledb.Model

的关系

我想知道的是如何将roles_users注册到flask-admin

通常您不需要添加用户角色连接 table。将用户和角色添加为单独的视图,但在用户视图中包括角色关系。例如:

给定以下两个模型和table:

class Role(db.Model, RoleMixin):
    __tablename__ = 'roles'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(length=64), unique=True)
    description = db.Column(db.Unicode(length=255), nullable=True)

    def __unicode__(self):
        return u"{name} ({role})".format(name=self.name, role=self.description or 'Role')

user_to_role = db.Table('user_to_role',
    db.Column('user_id', db.Integer(), db.ForeignKey('users.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('roles.id')))


class User(db.Model, UserMixin):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)

    first_name = db.Column(db.Unicode(length=255), nullable=False)
    last_name = db.Column(db.Unicode(length=255), nullable=False)

    email = db.Column(db.Unicode(length=254), unique=True, nullable=True)
    password = db.Column(db.Unicode(length=255), nullable=False)
    active = db.Column(db.Boolean(), default=False)

    roles = db.relationship('Role', secondary=user_to_role, backref=db.backref('users', lazy='select'))

    def __unicode__(self):
        return u"{first_name} ({last_name})".format(first_name=self.first_name, last_name=self.last_name)

使用这两个视图(Flask-Admin 1.4):

class UserView(ModelView):
    can_view_details = True
    column_list = ['first_name', 'last_name', 'email', 'roles', 'active']
    column_default_sort = ('last_name', False)
    column_filters = [
        'first_name',
        'last_name',
        'email',
        'active',
        'roles.name',
    ]
    column_details_list = [
        'first_name', 'last_name', 'email', 'active', 'roles',
        'confirmed_at', 'last_login_at', 'current_login_at', 'last_login_ip', 'current_login_ip', 'login_count',
    ]
    form_columns = [
        'first_name', 'last_name', 'email', 'active', 'roles',
    ]


class RoleView(ModelView):
    column_list = ['name', 'description']

    form_columns = ['name', 'description']