【问题标题】:Flask-Admin upload and insert in database automaticallyFlask-Admin 自动上传并插入数据库
【发布时间】:2013-10-09 14:15:03
【问题描述】:

我的用户在 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/ 解释清楚),但是找不到任何关于如何在同一个视图中合并添加用户和照片上传的信息。

有什么线索吗?

【问题讨论】:

  • 你是如何添加用户和上传照片的?您是否使用 2 个不同的视图?你能分享一些代码吗?
  • 我的管理面板的视图是这样的:pastebin.com/9J6pEA0Z。可以想象,它将为 Content 和 FileUpload 呈现一个单独的视图(我想将它们合并,这样当我添加内容时,url 将与上传的文件相同)Thnks!

标签: python flask flask-sqlalchemy flask-admin


【解决方案1】:

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

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 我希望这可以帮助别人!

【讨论】:

猜你喜欢
  • 2013-07-29
  • 1970-01-01
  • 2023-03-15
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多