如何在Django中将本地文件分配给FileField?

46 投票
4 回答
32202 浏览
提问于 2025-04-16 02:54

我想把电脑里的一个文件分配给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

如果你想在Django中上传一个本地文件,可以这样做:

from django.core.files import File

file = open(filepath, 'rb')
file_to_upload = File(file, name=f'{your_desired_name}')
file.close()

现在你可以把这个文件传给Django的序列化器来上传,或者根据你的需求来处理。如果把这个文件传给序列化器,记得在传完之后要把它关闭。

注意:这里的文件路径可以是Django的临时文件,也可以是任何存储的文件。

5

如果你不想打开这个文件,你也可以把文件移动到媒体文件夹,然后直接用相对于MEDIA_ROOT的路径来设置myfile.name:

import os
os.rename('mytest.pdf', '/media/files/mytest.pdf')
pdfImage = FileSaver()
pdfImage.myfile.name = '/files/mytest.pdf'
pdfImage.save()
58

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

撰写回答