41

我试图将磁盘中的文件分配给 FileField,但出现此错误:

AttributeError:“str”对象没有属性“open”

我的python代码:

pdfImage = FileSaver()
pdfImage.myfile.save('new', open('mytest.pdf').read())

和我的models.py

class FileSaver(models.Model):

    myfile = models.FileField(upload_to="files/")

    class Meta:
        managed=False

预先感谢您的帮助

4

3 回答 3

50

Django 使用它自己的文件类型(具有明显增强的功能)。无论如何,Django 的文件类型就像一个装饰器,所以你可以简单地将它包装在现有的文件对象上以满足 Django API 的需求。

from django.core.files import File

local_file = open('mytest.pdf')
djangofile = File(local_file)
pdfImage.myfile.save('new', djangofile)
local_file.close()

您当然可以通过编写以下内容(少一行)来动态装饰文件:

pdfImage.myfile.save('new', File(local_file))
于 2010-08-17T12:27:27.863 回答
2

如果不想打开文件,也可以将文件移动到 media 文件夹中,直接将 myfile.name 设置为 MEDIA_ROOT 的相对路径

import os
os.rename('mytest.pdf', '/media/files/mytest.pdf')
pdfImage = FileSaver()
pdfImage.myfile.name = '/files/mytest.pdf'
pdfImage.save()
于 2021-02-11T19:02:16.227 回答
1

如果您收到如下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position...

那么你必须以二进制模式打开文件:open("mytest.pdf", "rb")

完整示例:

from django.core.files import File

pdfImage = FileSaver()
pdfImage.myfile.save('new.pdf', File(open('mytest.pdf','rb')))
于 2021-09-02T23:46:21.920 回答