2012-04-10 31 views
0

ファイルのフルパスなしでファイル名も保存する必要があります。間違ったファイル名example.jpgを保存し、既存の名前のファイルがすでに存在する場合、およびoffcourseディスクに書き込みファイルexample_1.jpg、example_2.jpgが、ファイル名に例をアップロードしたファイルのファイル名をモデルに保存する方法

class Photo(models.Model): 
    photo = models.ImageField(upload_to = settings.PATH_PHOTOS_SOURCE) 
    user = models.ForeignKey(UserProfile, editable=False) 
    item = models.ForeignKey(Item, default=0) 
    filename = models.CharField(max_length=100, default='', editable=False) 

    def save(self, *args, **kwargs): 
     self.filename = os.path.basename(self.photo.url) 
     super(Photo, self).save(*args, **kwargs) 

それが仕事ですが、存在します。 は、私はそうすること

は、私は私の保存方法に変更:

def save(self, *args, **kwargs): 
    super(Photo, self).save(*args, **kwargs)   
    self.filename = os.path.basename(self.photo.url) 
    super(Photo, self).save() 

それが仕事だが、しかし、私はこのコードを好きではない、多分よりエレガントなコードです。

信号でこれを実行しようとしましたが、再帰の保存に問題がありました。

答えて

2

settings.PATH_PHOTOS_SOURCEの代わりに、pass a function to upload_to

def upload_path_handler(self, filename): 
    return os.path.join(settings.PATH_PHOTOS_SOURCE, 
         os.path.basename(self.photo.url)) 

# in model 
photo = models.ImageField(upload_to=upload_path_handler) 

ファイル名のためのモデルインスタンスIDを使用したい場合は、REF Django admin file upload with current model id

あなたは、直接ファイル名として使用するには必ず、その安全を確保するためにphoto.urlの可能な値を検討する必要があるかもしれません。

+0

ありがとうございました。いい案。 – yAnTar

関連する問題