我正在尝试处理用户在Django 2.2中上载的文件,看来GET请求正在运行,但是POST抛出MultiValueDictKeyError。
我正在YouTube上关注Vitor Freitas辉煌的Django File Upload Tutorial。
大约5分钟后,讲师开始添加POST请求方法。就我使用的某些名称和其他应用而言,我的项目略有不同。我正在本地开发环境中运行Django 2.2,无意将来部署此项目。
我已经仔细检查了每行几次。
当我将“ POST”换成“ GET”时,MultiValueDictKeyError错误消失并且网页运行无错误,但是我的Django Shell并没有按我期望的那样打印文件名和大小。
views.py:
from django.shortcuts import render
from django.views.generic import TemplateView
class Home(TemplateView):
template_name = "home.html"
def upload(request):
if request.method == 'POST':
uploaded_file = request.FILES['document']
print(uploaded_file.name)
print(uploaded_file.size)
return render(request, 'upload.html')
我的upload.html:
{% block content %}
<h1> Eureka! </h1>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="document">
<button type="submit">Upload file</button>
</form>
{% endblock %}
urls.py:
from django.contrib import admin
from django.urls import path, re_path
# from . import views
from posts.views import *
from redactors.views import *
from counters.views import *
from AllAbove.views import *
from django.conf.urls.static import static
from django.conf import settings
from uploads.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'),
path('result/', result, name='result'),
path('seth/', counters, name='seth'),
path('uploads/', upload, name='upload'),
#path('james/', post_details, name='james'),
path('maggie/', maggie_post_details, name='maggie'),
path('AllAbove/', all_above, name='AllAbove'),
re_path(r'^posts/(?P<post_id>[0-9]+)/$', post_details, name='james'),
path('simon/', redactors, name='simon'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL,
我期望模板提示用户上传文件(如图像),然后在Django shell中显示文件名和大小。相反,我收到了MultiValueDictKeyError。该错误表明某处的“文档”名称存在问题。据我所知,在模板中和views.py
中都正确引用了“文档”这是完整的错误和回溯:
请求方法:POST 要求网址:http://127.0.0.1:8000/uploads/ Django版本:2.2 异常类型:MultiValueDictKeyError 异常值:“文档” 异常位置: getitem 中的/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/utils/datastructures.py, 80行 Python可执行文件:/ home // dev / projects / python / 2018-and-2019 / CC_Redact_Iter2 / venv / bin / python3 的Python版本:3.7.3 Python路径:
['/ home // dev / projects / python / 2018-and-2019 / CC_Redact_Iter2', '/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python37.zip', '/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7', '/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/lib-dynload', '/usr/lib64/python3.7', '/usr/lib/python3.7', '/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages'] 服务器时间:2019年7月19日星期五16:56:46 +0000
并且:
$ python3 manage.py运行服务器 使用StatReloader监视文件更改 正在执行系统检查... 系统检查未发现任何问题(0静音)。 七月19,2019-16:57:53 Django 2.2版,使用设置“ CC_Redact_Iter2.settings” 在http://127.0.0.1:8000/处启动开发服务器 用CONTROL-C退出服务器。 内部服务器错误:/ uploads / 追溯(最近一次通话): 文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/utils/datastructures.py”,第78行,位于 getitem < / strong> list_ = super()。获取项(键) KeyError:“文档” 在处理上述异常期间,发生了另一个异常: 追溯(最近一次通话): 文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/core/handlers/exception.py”,第34行,位于内部 响应= get_response(请求) 文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/core/handlers/base.py”,行115,位于_get_response 响应= self.process_exception_by_middleware(e,请求) 文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/core/handlers/base.py”,第113行,位于_get_response 响应= wraped_callback(请求,* callback_args,** callback_kwargs) 上传中的文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/uploads/views.py”,第9行 upload_file = request.FILES ['document'] getitem <中的文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/utils/datastructures.py”,第80行/ strong> 引发MultiValueDictKeyError(key) django.utils.datastructures.MultiValueDictKeyError:'文档' [19 / Jul / 2019 16:57:57]“ POST / uploads / HTTP / 1.1” 500 79510
答案 0 :(得分:1)
只需尝试使用MultiValueDict的get()
方法从request
字典中获取数据。
uploaded_file = request.FILES.get('document', None)