【问题标题】:How save filename of uploaded file in model如何在模型中保存上传文件的文件名
【发布时间】:2012-04-22 17:45:42
【问题描述】:

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

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()

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

我尝试使用信号来执行此操作,但我遇到了保存递归的问题。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

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

    如果您想使用模型实例 ID 作为文件名,请参考 Django admin file upload with current model id

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-21
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2012-10-07
      • 2012-12-22
      • 2021-10-11
      相关资源
      最近更新 更多