如何覆盖flask-admin的缩略图名称生成?

时间:2015-11-30 01:03:16

标签: python flask flask-wtforms flask-admin

我最难尝试自定义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的路径字段中。这是代码:

@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重命名为Daniel Rubio.jpg in static / images /

第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

我已将所有内容连接起来,以便除了在我的'static / images文件夹中之外,所有图像都被正确命名。在我通过Flask-admin提交员工之后,我的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`

1 个答案:

答案 0 :(得分:2)

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

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