我有这样的模特:
class User(db.Model):
__tablename__ = 'users'
__table_args__ = {'mysql_engine' : 'InnoDB', 'mysql_charset' : 'utf8'}
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
_password = db.Column('password', db.String(80))
def __init__(self, username = None, email = None, password = None):
self.username = username
self.email = email
self._set_password(password)
def _set_password(self, password):
self._password = generate_password_hash(password)
def _get_password(self):
return self._password
def check_password(self, password):
return check_password_hash(self._password, password)
password = db.synonym("_password", descriptor=property(_get_password, _set_password))
def __repr__(self):
return '<User %r>' % self.username
我有ModelView:
class UserAdmin(sqlamodel.ModelView):
searchable_columns = ('username', 'email')
excluded_list_columns = ['password']
list_columns = ('username', 'email')
form_columns = ('username', 'email', 'password')
但无论我做什么,当我正在编辑用户信息时,flask admin没有显示密码字段。有什么办法吗?甚至只是编辑哈希码。
答案 0 :(得分:5)
无法正常工作的原因 - Flask-Admin无法弄清楚如何处理SynonymProperty,因此无法生成表单字段。
现在有一种方法可以让它正常工作:
class UserAdmin(sqlamodel.ModelView):
searchable_columns = ('username', 'email')
excluded_list_columns = ['password']
list_columns = ('username', 'email')
form_columns = ('username', 'email')
def scaffold_form(self):
form_class = super(UserAdmin, self).scaffold_form()
form_class.password = wtf.TextField('Password')
return form_class
我推动了简单修复,增加了对SynonymProperty的支持,因此即使没有表单自定义也可以使用。不幸的是,我正在添加MongoDB后端,因此我很快就无法发布新版本。
以防万一,SynonymProperty被SQLAlchemy 0.7及更高版本中的混合属性所取代,Flask-Admin应该支持它。
答案 1 :(得分:0)
好多了:
from wtforms.fields import PasswordField
class UserAdmin(sqlamodel.ModelView):
searchable_columns = ('username', 'email')
excluded_list_columns = ['password']
form_overrides = dict(password=PasswordField)