Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Django中的磁盘“上载”文件_Python_Django_File Upload_Django Models - Fatal编程技术网

Python 从Django中的磁盘“上载”文件

Python 从Django中的磁盘“上载”文件,python,django,file-upload,django-models,Python,Django,File Upload,Django Models,我用python生成一个文件,并希望将该文件上载到django数据库。这样,它会自动放入媒体文件夹中,并与我的应用程序的所有其他文件一起整齐地组织起来 下面是我尝试过的:使用了类型暗示,因为它是Python3.6 这不是我试过的唯一一件事。首先,我直接设置了FileField,但这导致了保存失败,同时设置了mimetype字段。因为原始文件位于介质文件夹之外,因此会触发可疑文件操作 此外,表单还通过form.errors提供了一些关于上传的反馈 根据我的方法,要么如上所述保存失败(这意味着上传不

我用python生成一个文件,并希望将该文件上载到django数据库。这样,它会自动放入媒体文件夹中,并与我的应用程序的所有其他文件一起整齐地组织起来

下面是我尝试过的:使用了类型暗示,因为它是Python3.6

这不是我试过的唯一一件事。首先,我直接设置了FileField,但这导致了保存失败,同时设置了mimetype字段。因为原始文件位于介质文件夹之外,因此会触发可疑文件操作

此外,表单还通过form.errors提供了一些关于上传的反馈

根据我的方法,要么如上所述保存失败(这意味着上传不会实际复制媒体文件夹中的文件),要么表单返回错误,没有传输任何文件,并告知检查表单协议

现在我的理论是,我必须去初始化我自己的InMemoryUploadedFile实例,但我自己也不知道该怎么做,而且互联网上也没有可用的文档

感觉我从一开始就采取了错误的方法。如何正确执行此操作?

您是否定义了上传路径?如果不是,那就可以解释你所犯的错误

从我看来,你走的是对的。如果您的上传不需要动态路径,如果您只想在媒体/上传中使用它们,您可以通过以下方式为上传传递字符串值:

首先,感谢你指点我,让我找到了

ContentFile实际上解决了这个问题,因为它基本上是我正在寻找的InMemoryUploadedFile的自实例化版本。这是一个不存储在磁盘上的django文件

以下是完整的解决方案:

# views.py, file_out has been generated
with open(file_out, 'rb') as local_file:
    from django.core.files.base import ContentFile

    # we need to provide a name. Otherwise the Storage.save
    # method reveives a None-parameter and breaks.
    form = UploadForm(dict(), {'document': ContentFile(local_file.read(), name=name)})
    if form.is_valid():
        file = form.save(commit=False)
        # ... set additional fields
        file.save()
        form.save_m2m()
        return file

我当然喜欢。当我从一个普通的文件上传中得到文件时,这个模型工作得很好。不知道还有别的吗?我想我会增加悬赏soon@nO_OnE_910能否在GitHub gist或类似文件中包含错误消息的链接?没有这一点很难说。是的,说得好。我现在将添加更多信息,链接是@nO_OnE_910为什么不直接在媒体/上传/目录中创建文件?如果您自己生成文件,那么您就具有了这种灵活性,它应该可以修复您遇到的错误。
# file will be uploaded to MEDIA_ROOT/uploads
document = models.FileField(upload_to='uploads/')
# views.py, file_out has been generated
with open(file_out, 'rb') as local_file:
    from django.core.files.base import ContentFile

    # we need to provide a name. Otherwise the Storage.save
    # method reveives a None-parameter and breaks.
    form = UploadForm(dict(), {'document': ContentFile(local_file.read(), name=name)})
    if form.is_valid():
        file = form.save(commit=False)
        # ... set additional fields
        file.save()
        form.save_m2m()
        return file