Django使用commit=False获取上传文件名不存库报错如何解决
问题解决方法
错误原因
upload.save() 执行时会同时完成两个操作:将上传文件持久化到服务器磁盘、将模型实例数据写入SQLite数据库。你注释掉该行后,上传文件还未完成磁盘落盘,upload.file.name 没有生成有效的路径值,直接读取就会触发文件不存在的报错。
可用解决方案
方案1:直接从表单获取原始文件名(推荐,无额外IO操作)
无需依赖模型保存逻辑,直接从表单的 cleaned_data 中提取上传文件的原始名称,全程不会触发数据库写入:
upload = form.save(commit=False) # 直接从表单文件对象取文件名,不需要执行save操作 uploadFile = form.cleaned_data['file'].name # 后续如果不需要保存实例到数据库,无需再调用upload.save()
方案2:需要落盘文件时的处理逻辑
如果你有业务要求必须先把上传文件存储到磁盘再获取文件名,可以先完成文件落盘,再清空文件字段后再写入数据库(或者直接不写入数据库):
upload = form.save(commit=False) upload.save() uploadFile = upload.file.name.split('/')[-1] # 不需要存文件名到数据库的话,清空文件字段后再保存 upload.file = None upload.save() # 如果不需要存这条记录到数据库,删除上面两行即可
内容的提问来源于stack exchange,提问作者Felipe Dourado
相关产品推荐
相关产品推荐

