0


我在 django web 应用程序中使用 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 月(我们上传图像的月份)。

有谁知道我将如何为将来上传的文件以及过去上传的文件解决这个问题?

4

1 回答 1

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 项目提交了一个问题。希望作者改正。

于 2014-03-03T09:15:36.863 回答