Я использую django-imagekit, чтобы предоставлять уменьшенные версии загруженных изображений на моих моделях Django.
Я хотел бы определить различные миниатюры ImageSpecField
в миксине, которые затем могут наследовать мои модели. Однако каждая модель в настоящее время имеет другое имя для ImageField
, на котором будут основаны ее ImageSpecField
.
Я пробовал это:
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: объект «Книга» не имеет атрибута «list_thumbnail»
Есть ли способ заставить такое наследование работать?
Есть как минимум два других решения:
- Не используйте миксин/родитель и включайте
ImageSpecField
в каждый дочерний класс - много повторяющегося кода. - Измените поля
Book.cover
иEvent.ticket
, чтобы они имели одинаковое имя, напримерimage
, и используйте"image"
для параметраImageSpecField
source
.
Последнее звучит лучше всего, но мне все еще любопытно, есть ли способ заставить работать наследование?
thumbnail
. Я все еще хотел бы знать, возможно ли заставить его работать иначе. - person Phil Gyford   schedule 07.04.2020