我的用户在 SQLAlchemy 中建模为:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
url_pic = Column(String(50), nullable=False)
(...)
我想将用户添加到 Flask-Admin 中的数据库,这样当我创建用户时,我可以直接上传照片,目标 url 被解析并传递给数据库中的 url_pic 字段。
我已经可以添加用户和上传照片(详见 https://flask-admin.readthedocs.org/en/latest/quickstart/ ),但找不到任何关于如何在同一 View 中合并添加用户和上传照片的信息。
有什么线索吗?
最佳答案
您可以将模型修改为如下所示:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
url_pic = Column(String(50), nullable=False)
pic = Column(LargeBinary, nullable=False)
...
现在您应该从 flask.ext.admin.contrib.sqla
继承 ModelView
。然后将该子类的实例添加到 Admin 实例。以下源代码可以帮助您理解这一点。
from flask.ext.admin.contrib.sqla import ModelView
from flask.ext.admin.form.upload import FileUploadField
from wtforms.validators import ValidationError
from flask.ext.admin import Admin
from flask.ext.sqlalchemy import SQLAlchemy
from flask import Flask
import imghdr
app = Flask(__name__)
db = SQLAlchemy(app)
class UserAdminView(ModelView):
def picture_validation(form, field):
if field.data:
filename = field.data.filename
if filename[-4:] != '.jpg':
raise ValidationError('file must be .jpg')
if imghdr.what(field.data) != 'jpeg':
raise ValidationError('file must be a valid jpeg image.')
field.data = field.data.stream.read()
return True
form_columns = ['id','url_pic', 'pic']
column_labels = dict(id='ID', url_pic="Picture's URL", pic='Picture')
def pic_formatter(view, context, model, name):
return 'NULL' if len(getattr(model, name)) == 0 else 'a picture'
column_formatters = dict(pic=pic_formatter)
form_overrides = dict(pic= FileUploadField)
form_args = dict(pic=dict(validators=[picture_validation]))
admin = Admin(app)
admin.add_view(UserAdminView(User, db.session, category='Database Administration'))
...
您可以在此处找到ModelView
的文档:link here
我希望这可以帮助别人!
关于python - Flask-Admin 自动上传并插入数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19274555/