django 在 / 'file' 处引发 MultiValueDictKeyError

Posted

技术标签:

【中文标题】django 在 / \'file\' 处引发 MultiValueDictKeyError【英文标题】:django raises MultiValueDictKeyError at / 'file'django 在 / 'file' 处引发 MultiValueDictKeyError 【发布时间】:2020-01-13 21:45:24 【问题描述】:

我正在尝试创建一个用于上传 .csv 文件并在模板上解析它的视图,但它返回了一个

MultiValueDictKeyError 在 /

'文件'

模板有

<form method="POST" enctype="multipart/form-data">% csrf_token %
<div class="file-field input-field">
<div class="btn">
<span>Upload a CSV FILE</span>
<input type="file" name="file">
</div>
<div class="file-path-wrapper">
 <input class="file-path validate" type="text">
</div>
<button class="waves-effect waves-light btn teal" type="submit">Upload</button>
</div>
</form>

那我的看法有

导入csv,io 从 django.shortcuts 导入渲染 从 django.contrib 导入消息 def 数据上传(请求): 模板=“home.html” 如果 request.method == 'GET': 返回渲染(请求,模板) csv_file = request.FILES['file'] 如果不是 csv_file.name.endswith('.csv'): messages.error(request, '请上传 .csv 文件。') data_set = csv_file.read().decode('UTF-8') io_string = io.StringIO(data_set) 下一个(io_string) 对于 csv.reader(io_string, delimiter=',', quoteschar="|") 中的列: _, created = Table.objects.update_or_create( 页=列[0], 关键字=列[1], 间隔=列[2], 电子邮件=列[3], 计费=列[4], 注释=列[5], ) 上下文 = 返回渲染(请求、模板、上下文)

我想知道为什么它会返回错误(?)。

【问题讨论】:

您应该使用multipart/form-data 标头上传此文件。 @Sahil 我不知道你是否错过了它,但在你评论之前它就已经在上面的模板中了 对不起,我的错。 你需要为get和post方法添加条件。如果 request.method == "GET" 渲染页面,否则检查 request.FILES["file"] 【参考方案1】:

我加了

if request.method == 'GET':
        return render(request, template)

它运行成功

【讨论】:

【参考方案2】:

@highcenbug 您的views.py 文件中仍有一处更正。 你需要使用quotechar。

   for column in csv.reader(io_string, delimiter=',', quotechar="|"):

【讨论】:

【参考方案3】:

这才是这个MultiValueDictKeyError的真正含义(摘自Django文档本身):

QueryDict.__getitem__(key)
Returns the value for the given key. If the key has more than one value, it returns the last value. Raises django.
utils.datastructures.MultiValueDictKeyError if the key does not exist. (This is a subclass of
Python’s standard KeyError, so you can stick to catching KeyError.) 

简单地说,这意味着 django 系统说他们在代码中提到的键值不存在。

这是来自 /home/user/.virtualenvs/you_virtual_envirenment_name/lib/python3.8/site-packages/django/utils/datastructures.py 中 datastructures.py 文件的部分代码:

def __getitem__(self, key):
        """
        Return the last data value for this key, or [] if it's an empty list;
        raise KeyError if not found.
        """
        try:
            list_ = super().__getitem__(key)
        except KeyError:
            raise MultiValueDictKeyError(key)
        try:
            return list_[-1]
        except IndexError:
            return []

上述方法是datastructures.py中字典键的getitem方法

参考:

Django 文档 PDF 版本第 6 章 API 参考,第 1326 页。

我不太记得我是如何下载它的,但我去了官方文档站点,有一个选项可以下载为 pdf 格式

感谢您阅读我的回答。

https://docs.djangoproject.com/en/3.1/

【讨论】:

以上是关于django 在 / 'file' 处引发 MultiValueDictKeyError的主要内容,如果未能解决你的问题,请参考以下文章

UWP开发细节记录:DirectX::XMMATRIX 的坑

在 Python 提示符处引发错误后如何获取最后一个异常对象?

如何在 Django 中引发 410 错误

在 Django REST 中引发异常

从 django 模型的保存方法中引发 ValidationError?

npm test 很好,但它也会在 askBackend ReferenceError: localStorage is not defined 处引发未捕获的错误