2012-04-10 111 views
0

我需要保存沒有完整路徑的文件和文件名。 我這樣做:如何在模型中保存上傳文件的文件名

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) 

它的工作,但存在的情況下,與現有名稱的文件已經存在,並且offcourse在磁盤寫文件example_1.jpg,example_2.jpg,但在文件名保存文件名不正確example.jpg

我改變了我的保存方法等等:

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爲文件名,裁判Django admin file upload with current model id

您可能需要考慮photo.url的可能值,以確保其安全地直接使用它作爲文件名。

+0

謝謝。好想法。 – yAnTar 2012-04-10 13:44:57

相關問題