Flask-Admin: как получить атрибут объекта Model в ModelView? - PullRequest
0 голосов
/ 02 июля 2018

Начальная информация:

У меня есть Page модель в SQLAlchemy:

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 (ModelView из 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») в качестве имени подпапки. Это нужно для настраиваемого дублирующего действия, чтобы файлы с одинаковыми именами не перезаписывали друг друга.

Основная проблема: Я не могу получить Page атрибут объекта внутри PageView, чтобы использовать его в пути. Я могу получить его в некоторых методах Flask-Admin, например, on_model_change, так что я могу перемещать / удалять файлы вручную после каждого изменения модели, но это действительно неуместно.

Вопрос : Итак, есть ли способ использовать атрибут объекта внутри ModelView? Что-то вроде __init__ super() и так далее вполне приемлемо:)

1 Ответ

0 голосов
/ 03 июля 2018

Решено с помощью ImageUploadField.namegen ( документы ). Я решил не создавать подкаталоги, а добавить 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,
    )
}
...