You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中CSV导入数据遇MultiValueDictKeyError报错求助

解决Django CSV上传的MultiValueDictKeyError问题

错误原因

  1. 模板中文件输入框的name="sent_file"与表单类里定义的file字段名不匹配,导致表单无法识别该文件字段,视图直接从request.FILES取sent_file时触发MultiValueDictKeyError。
  2. 原视图对上传文件的循环逻辑错误——单个文件上传时,request.FILES['file']是单个UploadedFile对象,不是可迭代的列表。
  3. 原代码仅读取了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:10:24