【问题标题】:How can I override flask-admin's thumbnail name generation?如何覆盖烧瓶管理员的缩略图名称生成?
【发布时间】:2015-11-30 01:03:15
【问题描述】:

我在尝试自定义 flask-admin 以更改我的管理视图中缩略图的名称时遇到了最困难的情况。我一直在四处寻找如何做到这一点,我认为答案在于 ImageUploadField 的 namegen 和 thumbgen 属性,但我不确定。有人可以帮忙吗?这就是我想要做的。

第 1 步:

这是我为管理视图生成的模型。它是一个有字段的员工。

class Employee(db.Model):
  __tablename__ = 'employees'
  id = db.Column(db.Integer, primary_key=True)
  name = db.Column(db.String(200))
  title = db.Column(db.String(200))
  email = db.Column(db.String(200))
  department = db.Column(db.String(200))
  path = db.Column(db.String(300))

  def __init__(self, name='', title='', email='', department='', path=''):
    self.name = name
    self.title = title
    self.email = email
    self.department = department
    self.path = path

  def __repr__(self):
    return '<Employee %r>' % self.name
admin.add_view(EmployeeView(Employee, db.session))

第 2 步:

对于此步骤,用户通过表单上传员工的上传信息。当他们按下提交时,会发生一些自定义代码,导致第 3 步。

第 3 步:

我有一个listens_for 回调,它采用他们提供的图像的名称并将文件的名称更改为员工的名称。 例如,如果我上传一个名为 me.jpg 的图像,该文件将更改为 Daniel Rubio.jpg,并将作为 Daniel Rubio 存储在 Employee's path 字段中。这是代码:

@listens_for(Employee, 'before_insert')
def change_employee_path(mapper, connection, target):
    if target.path:
        os.rename(os.path.join(app.config['UPLOAD_FOLDER'], target.path), 'static/images/' + target.name + '.jpg')
        target.path = target.name + '.jpg'

此外,此代码会将我的 static/images/ 文件夹中的 me.jpg 重命名为 static/images/ 中的 Daniel Rubio.jpg

第 4 步:

接下来,我使用 Flask-Admin 从示例代码中获取此代码,以显示我的模型及其关联的图像。这是代码:

class EmployeeView(ModelView):
def _list_thumbnail(view, context, model, name):
    if not model.path:
        return ''
    return Markup('<img src="%s">' % url_for('static',
                                              filename= 'images/' + form.thumbgen_filename(model.path)))
column_formatters = {
    'path': _list_thumbnail
}

form_extra_fields = {
    'path': form.ImageUploadField('Image', base_path=file_path, thumbnail_size=(100, 100, True))
}
def is_accessible(self):
    return flask_login.current_user.is_authenticated

我已经连接了所有东西,以便图像在任何需要的地方都被正确命名,除了在我的“静态/图像”文件夹中。通过 Flask-admin 提交 Employee 后,我的 me.jpg 生成 me_thumb.jpg 而不是 Daniel Rubio_thumb.jpg。我一生都无法弄清楚如何自定义它以防止这种情况发生。我很确定这发生在 Flask-Admin ImageUploadField 的 ImageUploadField 中,但我无法让它工作。我该怎么做才能让它发挥作用?非常感谢您的帮助。


修复尝试 #1

覆盖 ImageUploadField

class ImageOverride(form.ImageUploadField('Image', base_path=file_path, thumbnail_size=(100, 100, True))):
def __init__(self, thumbgen=None):
    self.thumbgen=self.path


class EmployeeView(ModelView):
    def _list_thumbnail(view, context, model, name):
        if not model.path:
            return ''
        return Markup('<img src="%s">' % url_for('static',
                                                  filename= 'images/' + form.thumbgen_filename(model.path)))
    column_formatters = {
        'path': _list_thumbnail
    }

    form_extra_fields = {
        'path': ImageOverride()
    }
    def is_accessible(self):
        return flask_login.current_user.is_authenticated

结果:

Error: `TypeError: 'UnboundField' object is not callable`

【问题讨论】:

  • 你是对的 - 你所要做的就是从 ImageUploadField 继承,覆盖这些方法并使用你的字段。
  • 乔斯,感谢您的回复。你能看看我的编辑。这就是你的想法。我对 Python 和 Flask 都是新手,所以我正在尝试找出让它工作的最佳方法。这是你的意思吗?
  • 不,您从类继承,而 ImageUploadField 是一个类。然后你重写一些方法(文件名生成)并在管理中使用 ImageOverride 而不是 ImageUploadField。
  • 乔斯,感谢您的帮助。最终,我做了一个更脏的解决方案,但我能够得到我需要的东西。

标签: python flask flask-wtforms flask-admin


【解决方案1】:

最后我不得不绕过乔斯的建议,而是想出了这个解决方案:

class EmployeeView(ModelView):
def _list_thumbnail(view, context, model, name):
    if not model.path:
        return ''
    return Markup('<img height="100" width="100" src="%s">' % url_for('static',
                                              filename= 'images/' + model.path))
column_formatters = {
    'path': _list_thumbnail
}

form_extra_fields = {
    'path': form.ImageUploadField('Image', base_path=file_path)
}

def is_accessible(self):
    return flask_login.current_user.is_authenticated

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多