【问题标题】:How to assign a local file to the FileField in Django?如何将本地文件分配给 Django 中的 FileField?
【发布时间】:2011-03-30 22:01:47
【问题描述】:

我试图将一个文件从我的磁盘分配给 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

提前感谢您的帮助

【问题讨论】:

    标签: python django filefield


    【解决方案1】:

    Django 使用它自己的file type(具有明显增强的功能)。无论如何,Django 的文件类型就像decorator,所以你可以简单地将它包装在现有的文件对象上以满足 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))
    

    【讨论】:

    • 覆盖 可能是个坏主意。最好使用文件_
    • 只是为了解释上面的评论(我有点困惑)亚伦在谈论符号file(即变量的名称)而不是传递的参数类型。
    • 记得关闭python文件对象, Django文件对象。
    • 如果您得到UnicodeDecodeError,请尝试以二进制模式打开文件:local_file = open("mytest.pdf", "rb")
    • 由于答案中的“file”变量被重命名为“local_file”,@AaronMcMillin 的评论不再有意义。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您遇到如下错误:

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

      【讨论】:

        猜你喜欢
        • 2013-04-09
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2010-10-25
        • 2018-09-03
        相关资源
        最近更新 更多