1

ImageField を含むモデルがあります。私はすでにupload_toを設定し、独自のFileSystemStorageクラスを作成して、ファイルを一意の名前で保存することに対処しています...しかし...

このセットアップにより、ファイルごとに一意の名前でファイルをアップロードして保存できます (これで問題ありません) が、以前に存在したファイルを削除する必要もあります。

file1.png をアップロードすると、file1_xkdeujg.png として保存されます (これはランダムな文字列です)。

次に、django admin に移動し (django admin インターフェイスを使用するため、モデルを介して行う必要があります)、そのフィールドの画像を fileNEW.png に変更します。

今必要なことは次のとおりです。

1)新しいファイルをfileNEW_fjewiejk.png(画像が保存されるたびに一意のランダム文字列)として保存します-完了

2) 新しいファイルをデータベースに保存します -完了

3)古いファイルを削除します-file1_xkdeuig.png-ファイルシステムから-未完了

Q: ポイント 3 を手伝ってくれる人はいますか?

いくつかのコード:

class Page(models.Model):
    image           = models.ImageField(upload_to='pages/', storage=MyFileSystemStorage())

そして(このコードの大部分を他の場所から借りました...):

class MyFileSystemStorage(FileSystemStorage):

    def get_valid_name(self, name):
            file_root, file_ext = os.path.splitext(name)
            return "%s_%s%s" % (file_root, rand_key(8), file_ext)

    def get_available_name(self, name):
            dir_name, file_name = os.path.split(name)
            file_root, file_ext = os.path.splitext(file_name)
            count = itertools.count(1)
            while self.exists(name):
                    name = os.path.join(dir_name, "%s_%s%s" % (rand_key(32),  count.next(), file_ext))
            return name
4

2 に答える 2

1

答えはStackOverflowに関する同様の質問から来ました...

基本的には、元の画像をinitメソッドに保存し、保存する前に画像が変更されているかどうかを確認します。

保存後、元の画像パスに保存されている画像を削除します。

この回答も参照してください(Joshの回答は私が使用したものであり、データベースにヒットしないため、好んで使用しています)。

Django:保存するときに、フィールドが変更されたかどうかをどのように確認できますか?

于 2011-03-18T15:46:49.493 に答える
0

私が正しく理解していれば、ファイルの名前を変更すると、ファイルは移動されずに複製されます。Page クラスの save メソッドをオーバーライドすると、古いインスタンスと dew インスタンスにアクセスできます。 http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

古いファイル名を変数に保存するだけで、 super.save() を呼び出した後 os.system("rm "+path_to_file) 、ファイルが変更された場合に実行できます。これは役に立ちますか?

于 2011-03-18T14:51:58.587 に答える