2012-03-21 10 views
0

私はFileFieldに例えば、シンプルなDjangoの管理アプリケーション - ファイルのバージョンを追跡する方法

class Probe(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    nanoz_file = models.FileField(upload_to='nanoz_file', blank=True) 

でDjangoのモデルを持っている場合、ユーザーが新しいファイルをアップロードした場合に上書きされるからアップロードされたファイルを防止するための方法があります管理インターフェースでは?

また、古いファイルを保存しておくと、以前のファイルをモデルインスタンスに関連付けることができますか?

私は、特定のモデルインスタンスのnanoz_fileフィールドにアップロードされたすべてのファイルをリストすることができます。

+1

[django-reversion](https://github.com/etianen/django-reversion)を検討しましたか? – jpic

+0

@jpic、それは面白いですが、おそらく過剰です。私は単に古いファイルを保存する方法が必要です。 – Greg

答えて

3

Djangoはアップロードされたファイルを上書きしません。 'foo.png'を2回アップロードすると、2番目のファイルは 'foo_1.png'になります。これをテストしただけですが、私の言葉を取ってみません。

あなたがしなければならない(またはdjango-reversionをやらせる)だけで、以前のファイル名が記録されます。

JPICが言ったのと同じように
1

あなたは、この構造を使用することができます。

def edit_file(request, ...): 
    # Get the file model instance 
    file_model = ... # Code to get the instance 
    # Create a new instance of the model with the old file path 
    old_file = File(name='file1-v2', file=file_model.file, belongs=file_model) 
    old_file.save() 
    # Update the file_model with the new file data 

・ホープ、このことができます:

class File(models.Model): 
    name = models.CharField() 
    file = models.FileField(upload_to='files_storage/') 
    belongs = models.ForeignKey('self') 
    creation = models.DateTimeField(auto_now_add=True) 

は、次にビューであなたのようなものを使用することができます!

0

、あなたはジャンゴ・復帰を試みることができる、またはカスタマイズされたフィールド内またはGFKフィールドに区切って、テーブルの行の例えばDBの種類では、過去のファイルの

  • トラック名、。
  • globファイルは、ファイル名が管理されている限りオンラインです。

実際にはすべてのユーザーのアップロードを処理するために、生の名前を使用するのではなく、設計したパターンで名前を付ける方がよい(後で使用するために生の名前を保存することもできます)。名前フィールドがユニークであるので、あなたのケースについては、フィールドは、それはほとんど変化しない場合は、アップロードされたファイルのファイル名を生成するための拠点として適している:

import os.path 
from django.hash_compat import sha_constructor 

def upload_to(self, filename): 
    return 'nanoz_file/%s%s' % (
     sha_constructor(self.name).hexdigest(), os.path.splitext(filename)[-1]) 

class Probe(models.Model): 
    name = models.CharField(max_length=200, unique=True) 
    nanoz_file = models.FileField(upload_to=upload_to, blank=True) 

を次に、あなたのビューでは、名前のリストを取得することができプローブインスタンスプローブの全ファイルのうち、

import glob 
# be careful to operate directory securely 
glob.glob(os.path.join(
    os.path.dirname(probe.nanoz_file.path), 
    '%s*' % sha_constructor(probe.name).hexdigest())) 
関連する問題