Django如何创建一个文件并将其保存到模型的FileField中

Django如何创建一个文件并将其保存到模型的FileField中

model定义

class Result(models.Model):
    name = models.CharField(max_length=100)
    file = models.FileField(max_length=255)
    project_name = models.CharField(max_length=100, default='未命名工程')
    # 视频封面,容许为空
    cover = models.ImageField(upload_to='cover/', blank=True, null=True)

    def __str__(self):
        return self.name

详细接口

基本上,一个字段被声明为一个FileField,当被访问时,给你一个类的实例FieldFile,它给你几个方法来与底层文件进行交互。所以,你需要做的是:

self.file.save(new_name, new_contents)
new_name你希望分配的文件名在哪里,并且new_contents是文件的内容。

注意,new_contents必须是二者之一的一个实例django.core.files.Filedjango.core.files.base.ContentFile(见给出的链接手册的细节)。这两个选择归结为:

# Using File
f = open('/path/to/file')
self.file.save(new_name, File(f))
# Using ContentFile
self.file.save(new_name, ContentFile('A string with the file content'))

仍可能遇到问题

UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0x89 in position 0: invalid start byte

搜了一下发现,直接修改一下open为rb就行

最终的views.py中的处理函数

f = File(open(
    '/root/graduate_work/web_my/videoproject/media/iron_man_stack.png', 'rb'))
tmp_result = Result.objects.create(
    file=None,
    name=f.name,
    project_name=project_context['project'].name)
project_context['project'].result = tmp_result
project_context['project'].result.file.save("iron_man_stack.png", (f))

参考文件

ARST打卡第104周[104/521]

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值