【问题标题】:Hacking django-stdimage2 to support multiple images破解 django-stdimage2 以支持多个图像
【发布时间】:2011-08-09 19:19:21
【问题描述】:

我正在开发一个 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
你认为这是一个很好的解决方法吗?我也对其他想法持开放态度。

谢谢你:)

【问题讨论】:

    标签: django image


    【解决方案1】:

    我认为你在这里根本没有问题。

    django-stdimage{2} 将重命名为您的 gear_images 模型的对象 ID,而不是其父齿轮模型。所以一个齿轮可以有很多张图片,每张图片都会在文件名后面附加 gear_images pk。

    真的,只有在文件名中使用齿轮模型的 pk 而不是 gear_images pk 对您很重要时,您才会遇到问题。如果你对后者没问题,那么你不需要做任何事情,它应该可以工作。

    【讨论】:

    • 非常感谢,瑞奇。你的解释很有道理,我会测试一下。我应该这么想的,但是最近我的脑海里一直被其他编码问题所困扰。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2012-09-12
    • 2017-06-23
    • 2018-01-04
    • 2011-02-27
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多