2017-04-11 133 views
2

对不起,如果这是一个愚蠢的问题,但我仍然有点困惑。阅读瓶管理文件尚未给出任何结果。模型视图模型的属性

在这个例子中flask admin image upload example有一个自定义的模型视图名为ImageView的:

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中的模型及其属性?

谢谢

+1

flask-admin模型视图使用类属性来定义它们与模型交互的方式。模型作为参数传递给[视图构造函数](https://github.com/flask-admin/flask-admin/blob/master/flask_admin/model/base.py#L767),因此您无法在类级别访问模型。但在视图方法中,你可以通过'self.model'来获取它。你究竟在努力实现什么? –

+0

@SergeyShubin,我试图实现的是在将图像保存到base_path ='file_path'之前,我想追加到模型的'file_path' id。你有什么想法我可以做到这一点? – Nurjan

+0

@Nurzhan我无法理解'附加到模型的file_path id。 – stamaimer

回答

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。

+1

file_data是一个'File Storge'对象而不是一个模型对象。 – stamaimer

+0

@stamaimer糟糕,我的错。谢谢! –

+1

你有没有试过这段代码?我认为上传图像文件的过程是在构建当前实例的过程中。所以当'namegen'被调用时不会创建实例。 – stamaimer

0

正如我在第一个回答中所评论的,您无法访问当前模型实例的ID。尽管创建了实例,但它并未提交给数据库。当前实例没有主键。但其他字段是存在的,也许你可以使用其他字段而不是主键。