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

Leo*_*dom 30 python django filefield

我试图从我的磁盘分配文件到FileField,但我有这个错误:

AttributeError:'str'对象没有属性'open'

我的python代码:

pdfImage = FileSaver()
pdfImage.myfile.save('new', open('mytest.pdf').read())
Run Code Online (Sandbox Code Playgroud)

和我的models.py

class FileSaver(models.Model):

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

    class Meta:
        managed=False
Run Code Online (Sandbox Code Playgroud)

预先感谢您的帮助

tux*_*21b 40

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()
Run Code Online (Sandbox Code Playgroud)

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

pdfImage.myfile.save('new', File(local_file))
Run Code Online (Sandbox Code Playgroud)

  • 只是为了解释上面的评论(我有点困惑)Aaron正在谈论符号`file`(即变量的名称)而不是传递的参数类型. (7认同)
  • 覆盖<type'file'>可能是一个坏主意.最好使用file_ (4认同)

Luc*_*s B 5

如果不想打开文件,也可以将文件移动到 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()
Run Code Online (Sandbox Code Playgroud)