Я работаю над проектом 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
Как вы думаете, это хороший обходной путь? Я открыт и для других идей.
Спасибо:)