如何与 Flask-Admin 中的各个表单字段进行交互?

How to interact with individual form fields in Flask-Admin?

如何遍历 Flask-Admin 中可用的某些表单字段?

通常,当用户提交我为网站创建的自定义表单之一时,我使用 flask_bcrypt 来散列密码。但是,如果我使用 flask-admin 更改特定用户的密码,它就不会起作用,因为它不会将新密码保存为哈希值。

我想在将新密码存储到数据库之前对其进行哈希处理。

我怎样才能实现这个目标?我在网上看过,但一无所获。那么这是不可能的吗?我试过查看文档,但在那里找不到任何有用的东西。

假设这是我的数据模型:

class User(db.Model , UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    password = db.Column(db.String(60), nullable=False)

如果我不使用 flask-admin,这是我通常会使用的注册路线:

@app.route("/register", methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.validate_on_submit():
        hashed_pass=bcrypt.generate_password_hash(form.password.data).decode('utf-8')
        user = User(username=form.username.data,email=form.email.data, password=hashed_pass)
        db.session.add(user)
        db.session.commit()

我想从管理模型视图中获取密码字段并执行与上述代码相同的操作。

我在查看 SQLAlchemy 文档时找到了解决此问题的方法,只需设置一个事件侦听器,只要密码值被编辑或更改就会启动。

@event.listens_for(User.password, 'set')
def hashPass(target, value, oldvalue, initiator):
    if value != oldvalue:
        return bcrypt.generate_password_hash(value).decode('utf-8')
    else: 
        return oldvalue