Я использую 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'
Есть ли способ заставить наследование, подобное этому, работать?
Существует как минимум два других решения:
- Не используйте mixin / parent и включайте
ImageSpecField
s в каждый дочерний класс - много дублирующего кода. - Измените поля
Book.cover
и Event.ticket
на одно и то же имя, например image
, и используйте "image"
для параметра ImageSpecField
source
.
Последнее звучит лучше всего , но мне все еще интересно, есть ли способ заставить наследство работать?