如何在模型中保存上传文件的文件名

时间:2012-04-10 12:21:05

标签: django django-admin

我需要在没有完整路径的情况下保存文件也是文件名。 我这样做:

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)

这是工作,但存在的情况,当现有名称的文件已经存在,并且在磁盘写入文件example_1.jpg,example_2.jpg中的offcourse,但在文件名中保存不正确的文件名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()

这是有效的,但我不喜欢这段代码,也许是更优雅的代码。

我尝试用信号做这个,但是我遇到了保存递归的问题。

1 个答案:

答案 0 :(得分:2)

而不是settings.PATH_PHOTOS_SOURCEpass 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)

如果要对filename使用模型实例ID,请参考ref Django admin file upload with current model id

您可能需要考虑photo.url的可能值,以确保将其直接用作文件名是安全的。