【问题标题】:Access model's attrubutes inside of ModelView class访问模型视图类中的模型属性
【发布时间】:2017-04-11 05:58:51
【问题描述】:

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

在此示例中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 中访问模型及其属性?

谢谢

【问题讨论】:

  • flask-admin 模型视图使用类属性来定义它们与模型交互的方式。模型作为参数传递给view constructor,因此您无法在类级别访问模型。但在视图方法中,您可以通过self.model 获得它。你到底想达到什么目标?
  • @SergeyShubin,我试图实现的是在将图像保存到 base_path = file_path 之前,我想附加到模型的 file_path id。你知道我该怎么做吗?
  • @Nurzhan 我看不懂append to the file_path id of the model
  • @stamaimer,这是我对form_extra_fields 感兴趣的部分。我想附加到 file_path 这只是一些路径 'files/...' 字符串 'user_' + model_id 这将导致类似 'files/user_1'、'files/user_2' 等。
  • 此语句用form.ImageUploadField 覆盖名为path 的字段。第一个参数Image 是输入渲染为html时的标签。第二个参数是上传图片文件的保存路径。第三个参数是上传文件的缩略图大小,可以省略。

标签: python flask flask-admin


【解决方案1】:

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

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。

【讨论】:

  • file_data 是File Storge 对象而不是模型对象。
  • @stamaimer 哎呀,我的错。谢谢!
  • 你试过这个代码吗?我认为上传图像文件的过程是在当前实例的构建过程中。所以调用namegen 时不会创建实例。
  • 我写了一个演示来试试这个代码。它将从obj.id 返回None
  • @stamaimer 看起来它可以在现有对象上正常工作,新对象还没有 ID。恐怕这个限制不容易解决。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-01-28
    • 2015-10-22
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多