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)

这是可行的,但存在的情况是,当具有现有名称的文件已经存在,并且在磁盘中写入文件 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()

它的工作,但我不喜欢这个代码,也许是更优雅的代码。

我试图用信号来做到这一点,但我遇到了保存递归的问题。

4

1 回答 1

2

而不是settings.PATH_PHOTOS_SOURCE将函数传递给 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 管理文件上传与当前模型 ID

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

于 2012-04-10T12:53:37.840 回答