Взлом django-stdimage2 для поддержки нескольких изображений - PullRequest
0 голосов
/ 09 августа 2011

Я работаю над проектом Django, в котором пользователям должно быть разрешено загружать несколько изображений одновременно. Эта часть проекта, скорее всего, будет обработана SWFUpload, если у вас нет лучшего предложения.

Переименование, изменение размера и создание эскиза изображения будут обрабатываться django-stdimage2 .

Проблема
django-stdimage2 переименовывает каждое изображение, используя имя поля и первичный ключ объекта. Если для шестерни с первичным ключом 1 существует пять изображений, все пять изображений будут переименованы в «image_1.jpeg».

Прежде чем я представлю возможное решение, вот мои модели. По сути, один ряд передач может иметь несколько рядов gear_image.

class gear(models.Model):
       id = models.AutoField(primary_key=True)
       model = models.CharField(max_length=100)

class gear_images(models.Model):
       id = models.AutoField(primary_key=True)
       gear_id = models.ForeignKey(gear)
       image = StdImageField(upload_to='images/gear', blank=True, size=(640, 480, True), thumbnail_size=(100, 100, True))

Решение
Я думал добавить метку времени в миллисекундах и округлено к имени файла. Я не являюсь профессионалом Python или Django, но я заглянул в файл django-stdimage2 fields.py, и я думаю, что нашел код, который мне нужно отредактировать, чтобы это работало. Две строки кода, которые закомментированы, являются моими предлагаемыми решениями:

def _rename_resize_image(self, instance=None, **kwargs):
    '''
    Renames the image, and calls methods to resize and create the thumbnail
    '''
    if not kwargs.get('raw', None):
        if getattr(instance, self.name):
            filename = getattr(instance, self.name).path
            ext = os.path.splitext(filename)[1].lower().replace('jpg', 'jpeg')
            # time_stamp = int(round(time.time() * 1000))
            # dst = self.generate_filename(instance, '%s_%s_%s%s' % (self.name, instance._get_pk_val(), time_stamp, ext))
            dst = self.generate_filename(instance, '%s_%s%s' % (self.name, instance._get_pk_val(), ext))
            dst_fullpath = os.path.join(settings.MEDIA_ROOT, dst)
            if os.path.normcase(os.path.abspath(filename)) != os.path.normcase(os.path.abspath(dst_fullpath)):
                os.rename(filename, dst_fullpath)
                if self.size:
                    self._resize_image(dst_fullpath, self.size)
                if self.thumbnail_size:
                    thumbnail_filename = self._get_thumbnail_filename(dst_fullpath)
                    shutil.copyfile(dst_fullpath, thumbnail_filename)
                    self._resize_image(thumbnail_filename, self.thumbnail_size)
                setattr(instance, self.attname, dst)
                instance.save()

Каждое имя изображения будет выглядеть примерно так: image_1_159753456.jpeg
Как вы думаете, это хороший обходной путь? Я открыт и для других идей.

Спасибо:)

1 Ответ

0 голосов
/ 10 августа 2011

Я не думаю, что у вас здесь вообще есть проблема.

django-stdimage {2} будет переименовывать в id объекта вашей модели gear_images, а не в его родительскую модель gear.Таким образом, на одной шестерне может быть много изображений, и к каждому имени файла будет добавлен pk gear_images.

Таким образом, у вас есть проблема, только если вам важно использовать pk модели шестерни в имени файла вместоgear_images pk.Если вы согласны с последним, то вам ничего не нужно делать, оно должно просто работать.

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