как исправить "MultiValueDictKeyError" в Django 2.1.3 ' - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь получить значение 'name' из:

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

и отобразить его на другой странице, но я продолжаю получать MultiValueDictKeyError, когда я вызываю request.GET["fullname"], но если я использую 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

Traceback image

пожалуйста, как я могу исправить эту ошибку и отобразить значение имени на другой HTML-странице

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Похоже, что ваша форма была отправлена ​​неверно.

Форма, отправленная с использованием <form method="get">, данные будут доступны в request.GET, а отправленное содержимое будет отображаться на URL.

Чтобы предотвратить ввод ключаошибка, вы можете установить значение по умолчанию, значение по умолчанию будет установлено, если в словаре request.GET('fullname', None) нет ключа, и позже вы можете его проверить.

Аналогично <form method="post"> данные будут доступны в request.POST.

Вы можете получить доступ к необработанным данным формы в request.body независимо от используемого метода.

0 голосов
/ 05 мая 2019

Ваше поле ввода не заполнено (отсутствует 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 запросам.

Хорошее чтение для вас:

Работа с формами

Как работают представления Django

Позже редактировать: Я почти уверен, что ваш взгляд падает, когда вы пытаетесь загрузить страницу;Это потому, что у вас есть request.GET['fullname'], но у вас нет ничего подобного в вашем URL.Поэтому рекомендуется использовать .get()

ipdb> request
<WSGIRequest: GET '/lol/'>
ipdb> request.GET
<QueryDict: {}>
ipdb> request.GET['fullname']
*** django.utils.datastructures.MultiValueDictKeyError: 'fullname'
ipdb>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...