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

相关问题