【问题标题】:Django filestorage save method creates path dependent on filenameDjango 文件存储保存方法根据文件名创建路径
【发布时间】:2015-01-18 11:25:52
【问题描述】:

我正在尝试在 Django 中使用 filestorage。一切正常,但我猜是我的保存方法中的一件事。我有一个带有FileField的模型

download_url = models.FileField(verbose_name = 'Konfig', upload_to = file_path, storage = OverwriteStorage())

在我的模型中的这个方法中,我创建了file_path

def file_path(instance, filename):
        path = os.getcwd() + '/files'
        return os.path.join(path, str(instance.download_url), filename)

我使用的文件存储方法在我的 storage.py 中外包,我将其导入到我的 models.py

from django.core.files.storage import FileSystemStorage

class OverwriteStorage(FileSystemStorage):

    def _save(self, name, content):
        if self.exists(name):
            self.delete(name)
        return super(OverwriteStorage, self)._save(name, content)

    def get_available_name(self, name):
        return name

现在,当我在 django 的管理界面中创建一个新文件时,它成功上传了文件,使用正确的文件路径创建了一个数据库条目,但未能创建正确的路径。当我的文件名是 foo 时,路径如下所示:

cwd/files/foo/foo

如果它的名称是 bar.txt,它将如下所示:

cwd/files/bar.txt/bar.txt

我不希望 django 基于文件名创建子目录。你们能帮帮我吗?

【问题讨论】:

  • 在那一行 return os.path.join(path, str(instance.download_url), filename) 只需删除文件名
  • 我对您的评论的回答为时已晚,但是是的,这是正确的

标签: python django django-file-upload


【解决方案1】:

我很确定您必须将保存功能从“save”重命名为“_save”。

在 Super Call 中,你使用了 ._save,它和上面的 save 函数不是同一个函数。

你可以阅读很多关于 Super here

【讨论】:

  • 我现在改变了,但不幸的是这并没有带来改变
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 2018-03-06
  • 2016-01-28
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
相关资源
最近更新 更多