我最难尝试自定义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`
答案 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