【问题标题】:Flask-Admin: How to get Model object attribute in ModelView?Flask-Admin:如何在 ModelView 中获取模型对象属性?
【发布时间】:2018-07-02 19:25:21
【问题描述】:

初始信息:

我在SQLAlchemy 中有Page 模型:

class Page(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128), index=True, nullable=False)
    url = db.Column(db.String(128), default="", nullable=False, unique=True)
    main_image = db.Column(db.Unicode(128))

它有PageViewModelView 来自Flask-Admin)和ImageUploadField 覆盖:

class PageView(ModelView):

    form_extra_fields = {
        'main_image': form.ImageUploadField(
            'Main image',
            base_path=file_path,
            relative_path='product_images/{}/'.format(models.Page.url),
            thumbnail_size=(100, 100, True),
        )}

from app import models

我想要什么:将图像保存在每个页面的不同子文件夹中,使用页面 url(如“about”或“samsung-galaxy-7”)作为子文件夹名称。自定义重复操作需要它,因此具有相同名称的文件不会相互覆盖。

主要问题:我无法在PageView 中获取Page 对象属性以在路径中使用它。我可以在一些 Flask-Admin 方法中得到它,比如 on_model_change,所以我可以在每次模型更改后手动移动/删除文件,但感觉真的很不合 Python。

问题:那么,有没有办法在ModelView 中使用对象属性? __init__ super() 之类的东西是完全可以接受的:)

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-admin


    【解决方案1】:

    已通过ImageUploadField.namegen (docs) 解决。我决定不创建子目录,而是为所有页面图像添加 url 前缀:

    def add_url_to_name(obj, file_data):
        parts = op.splitext(file_data.filename)
        return '{}_{}{}'.format(obj.url, parts[0], parts[1])
    
    form_extra_fields = {
        'main_image': form.ImageUploadField(
            'Main image',
            base_path=file_path,
            relative_path='product_images/',
            thumbnail_size=(100, 100, True),
            namegen=add_url_to_name,
        )
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2022-01-01
      • 1970-01-01
      • 2018-11-17
      相关资源
      最近更新 更多