如何在Django 2.1.3中修复“ MultiValueDictKeyError”

时间:2019-05-05 18:57:39

标签: django python-3.x

我正在尝试从中检索“名称”值:

  <input type="text" name="fullname" value="">

并将其显示在另一页上,但是当我调用request.GET["fullname"]时,我一直收到MultiValueDictKeyError,但是如果我使用request.POST.get('fullname', False),它将返回None。

views.py

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def hello(request):
    return HttpResponse('Hello World')

def index(request):
    fn= request.GET["fullname"]
    crs= request.GET["course"]
    st='your welcome to first_app/index.html'
    return render(request,'first_app/index.html',{'st':st,'fn':fn,'crs':crs})

def courses(request):
    string= 'my name is ibi'

    return render(request,'first_app/courses.html',{'st':string})

urls.py

from django.urls import path
from first_app import views

urlpatterns =[

path('',views.index, name='index'),
path('courses/', views.courses, name='courses'),

]

追踪

Traceback image

请问如何纠正此错误,并在另一个html页面上显示名称值

2 个答案:

答案 0 :(得分:0)

看起来您的表单提交不正确。

使用<form method="get">数据提交的表单将在request.GET中可用,并且提交的内容将显示在url上。

为防止键错误,您可以设置默认值,如果字典request.GET('fullname', None)中没有键,则将设置默认值,以后您可以对其进行验证。

类似地,<form method="post">中将提供request.POST数据。

无论使用哪种方法,都可以在request.body中访问表单的原始数据。

答案 1 :(得分:-1)

您的输入字段已损坏(未归因于id

 <input type="text" id="fullname" name="fullname" value="foo">

不确定表单的其余部分如何,但是假设它具有以下属性:

<form action='.' method='POST'>
</form>

您想要做的是修改您的index视图:

def index(request):
    context = {'st': ''your welcome to first_app/index.html'', 'fn': '', 'crs': ''} # you want a default context
    if request.method == 'POST':
        context['fn'] = request.POT.get('fullname')
        context['crs'] = request.POST.get('course')
    return render(request,'first_app/index.html',{'st':st,'fn':fn,'crs':crs})

您将仅在POST个请求中查找通过表单提交的信息。

一些对您有帮助的读物:

Working with forms

How Django views work

以后的修改: 我很确定当您尝试加载页面时,您的视图崩溃了;这是因为您有request.GET['fullname'],但您的URL中没有类似的内容。这就是为什么建议使用.get()

ipdb> request
<WSGIRequest: GET '/lol/'>
ipdb> request.GET
<QueryDict: {}>
ipdb> request.GET['fullname']
*** django.utils.datastructures.MultiValueDictKeyError: 'fullname'
ipdb>