在模型视图中访问模型属性 class

Access model's attrubutes inside of ModelView class

如果这是一个愚蠢的问题,请提前道歉,但我还是有点困惑。阅读烧瓶管理员文档尚未给出任何结果。

在此示例中 flask admin image upload example 有一个名为 ImageView 的自定义 ModelView:

class ImageView(sqla.ModelView):
    def _list_thumbnail(view, context, model, name):
        if not model.path:
            return ''

        return Markup('<img src="%s">' % url_for('static',
                                                 filename=form.thumbgen_filename(model.path)))

    column_formatters = {
        'path': _list_thumbnail
    }

    # Alternative way to contribute field is to override it completely.
    # In this case, Flask-Admin won't attempt to merge various parameters for the field.
    form_extra_fields = {
        'path': form.ImageUploadField('Image',
                                      base_path=file_path,
                                      thumbnail_size=(100, 100, True))
    }

_list_thumbnail(view, context, model, name)中有参数模型。在此方法内部,我可以访问模型的属性。

我的问题是如何在 _list_thumbnail(view, context, model, name) 方法之外但在 ImageView 内部访问模型及其属性?

谢谢

将模型数据传递到视图中定义的字段可能会很痛苦。但幸运的是 FileUploadField 及其子类可以获得 namegen 函数来生成名称作为参数。它接收 "dirty" 模型对象作为参数:

def name_generator(obj, file_data):
    return 'file_%d.png' % obj.id

class ImageView(sqla.ModelView):
    form_extra_fields = {
        'path': form.ImageUploadField('Image',
                                      base_path=file_path,
                                      namegen=name_generator,
                                      thumbnail_size=(100, 100, True))
    }

我还发现生成的文件名可能包含文件路径,而不仅仅是文件名。

更新:正如@stamaimer 所发现的,此方法不适用于数据库中尚不存在的对象,因为它们还没有 ID。

正如我在第一个答案中评论的那样,您无法访问模型当前实例的 ID。尽管创建了实例,但它还没有提交到数据库。当前实例没有主键。但是另一个字段是存在的,也许你可以用其他字段代替主键。