Django Регенерировать только миниатюру, если вскрывают изменения - PullRequest
0 голосов
/ 06 февраля 2020

Я использую сигналы для удаления загруженных файлов при удалении или изменении объекта, но я вошел в проблему, которую я должен определить, когда повторно генерировать postocover_tn или нет, и я не знаю, как реализовать этот шаг. Мне просто нужно заново сгенерировать postcover_tn при изменении postcover

models.py (создать миниатюру при сохранении)

postcover = models.ImageField(
    verbose_name="Post Cover",
    blank=True,
    null=True,
)
postcover_tn = models.ImageField(
    verbose_name="Post Cover Thumbnail",
    blank=True,
    null=True,
)
...

    def save(self, *args, **kwargs):
        super(Post, self).save(*args, **kwargs)
        if self.postcover:
            if os.path.exists(self.postcover.path):
                image = Image.open(self.postcover)
                outputIoStream = BytesIO()
                baseheight = 500
                hpercent = baseheight / image.size[1]
                wsize = int(image.size[0] * hpercent)
                imageTemproaryResized = image.resize((wsize, baseheight))
                imageTemproaryResized.save(outputIoStream, format='PNG')
                outputIoStream.seek(0)
                self.postcover = InMemoryUploadedFile(outputIoStream, 'ImageField',
                                                      "%s.png" % self.postcover.name.split('.')[0], 'image/png',
                                                      sys.getsizeof(outputIoStream), None)
                image = Image.open(self.postcover)
                outputIoStream = BytesIO()
                baseheight = 175
                hpercent = baseheight / image.size[1]
                wsize = int(image.size[0] * hpercent)
                imageTemproaryResized = image.resize((wsize, baseheight))
                imageTemproaryResized.save(outputIoStream, format='PNG')
                outputIoStream.seek(0)
                self.postcover_tn = InMemoryUploadedFile(outputIoStream, 'ImageField',
                                                      "%s.png" % self.postcover.name.split('.')[0], 'image/png',
                                                      sys.getsizeof(outputIoStream), None)
        elif self.postcover_tn:
            self.postcover_tn.delete()

        super(Post, self).save(*args, **kwargs)

signal.py

@receiver(models.signals.pre_save, sender=Post)
def post_auto_delete_files_on_change(sender, instance, **kwargs):
    """
    Deletes old file from filesystem
    when corresponding object is updated
    with new file.
    """
    if not instance.pk:
        return False

    try:
        old_postcover = sender.objects.get(pk=instance.pk).postcover
        old_postcover_tn = sender.objects.get(pk=instance.pk).postcover_tn
    except sender.DoesNotExist:
        return False
    if not old_postcover:
        return

    new_postcover = instance.postcover
    new_postcover_tn = instance.postcover_tn
    if not old_postcover == new_postcover:
        if os.path.isfile(old_postcover.path):
            os.remove(old_postcover.path)
            if old_postcover_tn == new_postcover_tn:
                if os.path.isfile(old_postcover_tn.path):
                    os.remove(old_postcover_tn.path)

Так что я думаю, мне нужен переключатель здесь, чтобы сообщить методу сохранения, если postcover_tn должен быть сгенерирован заново или нет. Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...