Flask-Admin устанавливает роли пользователя по умолчанию при регистрации - PullRequest
0 голосов
/ 03 апреля 2019

Я создаю панель управления с 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'

И я также попробовал это решение Но теперь работает для меня.

Итак, можно ли установить роль по умолчанию при регистрации пользователя? ...

ПРИМЕЧАНИЕ : В другом случае я также задаю очень похожий вопрос: здесь , но есть в другом случае.Там я хочу, чтобы роль настраивалась, когда я делаю нового пользователя с помощью superuser , а не когда пользователи регистрируются самостоятельно.

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Я использую этот код во время инициализации приложения:

@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()
0 голосов
/ 04 апреля 2019

Я модифицировал код @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, ты кое-что понял для меня.

...