7

我的用户在 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/中进行了很好的解释),但找不到任何关于如何合并添加用户和照片上传的信息相同的看法。

有什么线索吗?

4

1 回答 1

8

您可以将模型修改为如下所示:

class User(Base):
   __tablename__ = 'users'
   id = Column(Integer, primary_key=True)
   url_pic = Column(String(50), nullable=False)
   pic = Column(LargeBinary, nullable=False)
   ...

现在你应该ModelViewflask.ext.admin.contrib.sqla. 然后将该子类的一个实例添加到 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链接在这里 我希望这可以帮助别人!

于 2014-11-20T19:57:33.290 回答