Flask-Admin:如何在 ModelView 中获取 Model 对象属性?
Flask-Admin: How to get Model object attribute in ModelView?
初始信息:
我在 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))
它具有 PageView
(来自 Flask-Admin
的 ModelView
)和 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
,所以我可以在每次模型更改后手动 move/remove 文件,但感觉真的不符合 pythonic。
问题:那么,有什么方法可以在ModelView
中使用对象属性吗? __init__ super()
之类的东西是完全可以接受的:)
已解决 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,
)
}
初始信息:
我在 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))
它具有 PageView
(来自 Flask-Admin
的 ModelView
)和 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
,所以我可以在每次模型更改后手动 move/remove 文件,但感觉真的不符合 pythonic。
问题:那么,有什么方法可以在ModelView
中使用对象属性吗? __init__ super()
之类的东西是完全可以接受的:)
已解决 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,
)
}