Flask-Admin / Flask-SQLAlchemy:为 INSERT 设置 user_id = current_user
Flask-Admin / Flask-SQLAlchemy: set user_id = current_user for INSERT
使用 Flask-Admin + Flask-SQLAlchemy 我定义了三个模型:User、Apikey、Exchange。
当经过身份验证的用户通过 Web 管理界面创建新的 Apikey 时,我希望将插入数据库的新行上的 user_id 设置为当前的 user_id 即已登录。
在我当前的实现中,用户可以选择她喜欢的任何用户(这是不需要的)。
这是我对模型的定义:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(255))
last_name = db.Column(db.String(255))
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
apikeys = db.relationship('Apikey', backref='user')
def __str__(self):
return self.email
class Apikey(db.Model):
id = db.Column(db.Integer, primary_key=True)
exch_user = db.Column(db.String(255))
exch_pass = db.Column(db.String(255))
exch_key = db.Column(db.String(255))
exch_secret = db.Column(db.String(255))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
exch_id = db.Column(db.Integer, db.ForeignKey('exchange.id'))
class Exchange(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
apikeys = db.relationship('Apikey', backref='exchange')
def __str__(self):
return self.name
在 Apikey 模型的管理视图中,您需要做几件事;隐藏 user_id 字段并在表单数据发布到数据库之前手动设置 user_id。
假设您也在使用 Flask-Login 或 Flask-Security,您的视图 class 应该类似于:
class ApikeyView(sqla.ModelView):
form_excluded_columns = ('user_id')
def on_model_change(self, form, model, is_created):
if is_created:
model.user_id = current_user.id
别忘了从 flask.ext.login
导入 current_user
使用 Flask-Admin + Flask-SQLAlchemy 我定义了三个模型:User、Apikey、Exchange。
当经过身份验证的用户通过 Web 管理界面创建新的 Apikey 时,我希望将插入数据库的新行上的 user_id 设置为当前的 user_id 即已登录。
在我当前的实现中,用户可以选择她喜欢的任何用户(这是不需要的)。
这是我对模型的定义:
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(255))
last_name = db.Column(db.String(255))
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
apikeys = db.relationship('Apikey', backref='user')
def __str__(self):
return self.email
class Apikey(db.Model):
id = db.Column(db.Integer, primary_key=True)
exch_user = db.Column(db.String(255))
exch_pass = db.Column(db.String(255))
exch_key = db.Column(db.String(255))
exch_secret = db.Column(db.String(255))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
exch_id = db.Column(db.Integer, db.ForeignKey('exchange.id'))
class Exchange(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
apikeys = db.relationship('Apikey', backref='exchange')
def __str__(self):
return self.name
在 Apikey 模型的管理视图中,您需要做几件事;隐藏 user_id 字段并在表单数据发布到数据库之前手动设置 user_id。
假设您也在使用 Flask-Login 或 Flask-Security,您的视图 class 应该类似于:
class ApikeyView(sqla.ModelView):
form_excluded_columns = ('user_id')
def on_model_change(self, form, model, is_created):
if is_created:
model.user_id = current_user.id
别忘了从 flask.ext.login
current_user