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 月に切り替えたので、すべてのサムネイル パスは 5 月 (画像をアップロードした月) ではなく 6 月 (現在の月) を指しています。

アップロードされた将来のファイルと過去にアップロードされたファイルに対してこれを修正する方法を知っている人はいますか?

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 に答える