django-stdimage动态文件结构

时间:2013-06-03 20:08:23

标签: python django module


我在django网络应用程序中使用django-stdimage。我想根据图像上传的时间使用动态文件结构上传图像。例如:

snapshot/<year>/<month>/<filename>

因此,如果我在2013年5月上传了图片,则该图片应放在此目录中:

snapshot/2013/05/

我的models.py中的代码如下所示:

class Snapshot(BaseModel):
...
image = StdImageField(upload_to='snapshot/%Y/%m', blank=False, size=(1170, 780),   thumbnail_size=(100, 100, True))
...

在我的模板中,我会显示如下缩略图:

<img src="{{snapshot.image.thumbnail.url}}">

我们已经在5月份上传了许多图片。但是,现在我们已经从5月切换到6月,所有缩略图路径现在指向6月(当前月份)而不是5月(我们上传图像的月份)。

有没有人知道我将如何解决此问题以备将来上传的文件以及过去上传过的文件?

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的错误。

此错误的原因:每次此StdImage实例初始化其.thumbnail字段时,它会调用self.generate_filename来获取其文件名,然后将“.thumnail”作为缩略图名称插入到文件名中。

来源:

def _set_thumbnail(self, instance=None, **kwargs):
    """Creates a "thumbnail" object as attribute of the ImageField instance
    Thumbnail attribute will be of the same class of original image, so
    "path", "url"... properties can be used

    """

    if getattr(instance, self.name):
        filename = self.generate_filename(instance,
                  os.path.basename(getattr(instance, self.name).path))

        thumbnail_filename = self._get_thumbnail_filename(filename)
        thumbnail_field = ThumbnailField(thumbnail_filename)
        setattr(getattr(instance, self.name), 'thumbnail', thumbnail_field)

当路径不是动态时,它是正确的。但是当我们使用动态路径(例如headimg = models.FileField(upload_to='headimg/%Y%m'))时,self.generate_filename的返回对应于今天的日期,因此每天都会更改thumbnail.path。

快速修复:

在stdimage / fields / py

的源代码中
def _set_thumbnail(self, instance=None, **kwargs):
    """Creates a "thumbnail" object as attribute of the ImageField instance
    Thumbnail attribute will be of the same class of original image, so
    "path", "url"... properties can be used

    """

    if getattr(instance, self.name):
        #fix the bug of wrong thumbnail path
        #filename = self.generate_filename(instance,
        #          os.path.basename(getattr(instance, self.name).path))
        file_path = getattr(instance, self.name).path
        file_prefix = self.upload_to[:self.upload_to.find('/')]
        filename = file_path[file_path.find(file_prefix):]

        thumbnail_filename = self._get_thumbnail_filename(filename)
        thumbnail_field = ThumbnailField(thumbnail_filename)
        setattr(getattr(instance, self.name), 'thumbnail', thumbnail_field)

它对我有用。

我向github上的stdimage项目提交了一个问题。希望作者能修好它。