1

レガシーサイト(元々はレールで書かれていました)を変換していますが、デフォルトでは画像はフォーマットを使用して保存され{{pk}}.{{extension}}、新しいファイルがアップロードされるとそのファイルは常に上書きされていました。このdjangoバージョンでそのフォーマットを継続したいと思います。

私は当初、FileSystemStorageを拡張するのが良い方法だと思っていましたが、現在のモデルオブジェクトをそれに渡す方法がわかりません。誰かがこれを達成するための「ジャンゴの方法」についての提案がありますか?

これを管理するために拡張する独自のクラスを作成する必要がある場合はImageField、そうしてください。:)私が見逃している単純なものがあったかどうか疑問に思っています。

[編集] surfeurxとDrTyrsaからの回答に基づいて私がしたこと:

temp_image = None

def image_path(self, uploaded_file_name):
    prefix = 'designs/'
    extension = os.path.splitext(uploaded_file_name)[-1]
    if self.pk != None:
        return prefix + str(self.pk) + extension
    else:
        tmp_name = str(uuid.uuid4())
        self.temp_image = prefix + tmp_name + extension
        return self.temp_image

image_upload = models.ImageField(upload_to=image_path, null=True, blank=True) 

def save(self):
    self.updated_at = datetime.now()

    is_new = self.pk == None
    super(Design, self).save()

    if is_new:
        if self.temp_image != None:
            os.rename(MEDIA_ROOT + self.temp_image, MEDIA_ROOT + self.image_path(self.temp_image))
            self.temp_image = None

私が今抱えている本当の問題は、画像を上書きしたいということです。ImageFieldこれにより正しいファイル名が提供されますが、上書きするには拡張する必要があるようです。この小さな男を見つけました:http://djangosnippets.org/snippets/636/

4

2 に答える 2

3

関数を定義する必要がありますupload_to。引数として受け入れinstanceます。ただし、インスタンスを作成する場合はまだ作成されていないことを忘れないでくださいpk(ただし、最初にインスタンスを保存してから、イメージを保存することができます)。

于 2011-10-21T08:22:51.450 に答える
3

あなたはupload_toのように使うことができます:

def image_path(instance, filename):
    return instance.id + os.path.splitext(filename)[1]

class Brand(models.Model):
    ...
    logo = models.ImageField(upload_to=image_path, null=True, blank=True)
于 2011-10-21T10:18:00.397 に答える