Как определить django -imagekit ImageSpecFields в родительском / mixin классе? - PullRequest
0 голосов
/ 06 апреля 2020

Я использую django -imagekit для предоставления уменьшенных версий загруженных изображений на моих Django моделях.

Я хотел бы определить различные миниатюры ImageSpecField s в миксин, который мои модели могут наследовать. Тем не менее, каждая модель в настоящее время имеет свое имя для ImageField, на котором будут основываться ImageSpecField s.

Я пробовал это:

from django.db import models
from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFit

class ThumbnailModelMixin(models.Model):
    IMAGE_SPEC_SOURCE_FIELD = None

    list_thumbnail = ImageSpecField(
        source=IMAGE_SPEC_SOURCE_FIELD,
        processors=[ResizeToFit((80, 160)],
        format="JPEG",
        options={"quality": 80}
    )

    class Meta:
        abstract = True

class Book(ThumbnailModelMixin):
    IMAGE_SPEC_SOURCE_FIELD = "cover"
    cover = models.ImageField(upload_to="books/")

class Event(ThumbnailModelMixin):
    IMAGE_SPEC_SOURCE_FIELD = "ticket"
    ticket = models.ImageField(upload_to="events/")

Но это не удается на загрузка страницы с:

AttributeError: у объекта 'Book' нет атрибута 'list_thumbnail'

Есть ли способ заставить наследование, подобное этому, работать?

Существует как минимум два других решения:

  1. Не используйте mixin / parent и включайте ImageSpecField s в каждый дочерний класс - много дублирующего кода.
  2. Измените поля Book.cover и Event.ticket на одно и то же имя, например image, и используйте "image" для параметра ImageSpecField source.

Последнее звучит лучше всего , но мне все еще интересно, есть ли способ заставить наследство работать?

...