【发布时间】: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