Django中CSV导入数据遇MultiValueDictKeyError报错求助
解决Django CSV上传的MultiValueDictKeyError问题
错误原因
- 模板中文件输入框的
name="sent_file"与表单类里定义的file字段名不匹配,导致表单无法识别该文件字段,视图直接从request.FILES取sent_file时触发MultiValueDictKeyError。 - 原视图对上传文件的循环逻辑错误——单个文件上传时,
request.FILES['file']是单个UploadedFile对象,不是可迭代的列表。 - 原代码仅读取了CSV数据,未将数据批量保存到数据库。
修复方案
1. 修正模板字段匹配
将模板中的自定义文件输入替换为表单渲染的字段,确保字段名一致:
<form method="POST" enctype="multipart/form-data"> {% csrf_token %} <!-- 渲染表单所有字段(title和file),也可手动渲染单个字段 --> {{ form.as_p }} {% if request.user.is_authenticated %} <button type="submit" class="btn btn-outline-primary">Confirmar</button> {% endif %} <a href="{% url 'listar_colecao' %}"> <button type="button" class="btn btn-outline-danger">Cancelar</button> </a> </form>
2. 修正视图逻辑,处理CSV并批量保存
修改ColecaoCSVCreate的form_valid方法(更符合CreateView的规范):
import csv import io from django.views.generic.edit import CreateView from django.urls import reverse_lazy from .models import Colecao from .forms import FileFieldForm class ColecaoCSVCreate(CreateView): login_url = reverse_lazy('login') form_class = FileFieldForm template_name = 'formulario/formulario_csv.html' success_url = reverse_lazy('listar_colecao') def form_valid(self, form): # 从表单的cleaned_data获取上传的CSV文件 csv_file = form.cleaned_data['file'] decoded_content = csv_file.read().decode('utf-8') reader = csv.DictReader(io.StringIO(decoded_content)) # 批量创建Colecao实例(根据CSV列名和模型字段调整) instances = [] for row in reader: # 示例:假设CSV包含title字段,或使用表单提交的title作为默认值 instance = Colecao( title=row.get('title', form.cleaned_data['title']), # 其他模型字段请对应CSV列名补充,例如: # descricao=row['descricao'], # data_criacao=row['data_criacao'] ) instances.append(instance) # 批量插入数据库,提升效率 Colecao.objects.bulk_create(instances) return super().form_valid(form)
3. 确保表单与模型匹配
确认Colecao模型包含title字段(表单中定义了该字段,且fields='__all__'),如果不需要表单中的title字段,可调整FileFieldForm的fields列表,仅保留file字段。
内容的提问来源于stack exchange,提问作者Mário Henrique
相关产品推荐
相关产品推荐

