注册时,Flask-Admin会设置默认用户角色

时间:2019-04-03 11:15:34

标签: python flask flask-sqlalchemy flask-admin

我使用 Flask-Admin 制作了一个仪表板,并使用 Flask-SQLAlchemy 用于我的模型,如下所示:

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):
    __tablename__ = 'role'
    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)
    name = db.Column(db.String(255))
    roles = db.relationship('Role', secondary=roles_users,
                            backref=db.backref('users', lazy='dynamic'))

我希望当用户向 Flask-Admin 注册时,该用户的默认角色已设置为 client enter image description here

我在 roles 列上尝试过类似的操作:

roles = db.relationship('Role', secondary=roles_users,
                     backref=db.backref('users', lazy='dynamic'),
                     default='client') # or default=3 (which is '3' is the client id in roles_user association table.

但我收到此消息:

TypeError: relationship() got an unexpected keyword argument 'default'

我也尝试过此solution 但是现在为我工作。

那么,用户注册时是否可以设置默认角色??

注意:在另一种情况下,我也对此问题here提出了非常相似的要求,但情况有所不同。我希望在这里由 superuser 创建新用户时设置角色,而不是在用户自行注册时设置角色。

2 个答案:

答案 0 :(得分:1)

我在应用初始化期间使用以下代码:

@user_registered.connect_via(app)     
def user_registered_sighandler(app, user, confirm_token):               
    default_role = user_datastore.find_role("user")         
    user_datastore.add_role_to_user(user, default_role)            
    db.session.commit()

答案 1 :(得分:0)

我正在修改@gitter代码,因此这是我的案例的有效代码:

@user_registered.connect_via(app)
    def user_registered_sighandler(app, user, confirm_token):
        default_role = Role.query.filter_by(name='client').first()
        user.roles.append(default_role)
        db.session.commit()

感谢@gitter,您为我做到了一些见识。