用Post方法实现多值dictkeyerror

2024-09-28 05:19:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表单,用户选择了一种颜色,这个值返回给我,但是当用户选择颜色时,返回多值dictkeyerror,我不知道为什么

这是我的观点:

def primeira_pergunta(request):
    trans = Tranfer()
    my_list = trans.shared[0]
    respostaum = ['amarelo', 'vermelho', 'roxo', 'cinza']
    selecionada = 'amarelo'
    if request.method == 'POST':
        respostaum = request.POST['respostaum']
        selecionada = request.POST['selecionada']
    #if selecionada != 'Escolha uma':
        f = Cheiro.objects.get(pk=my_list)
        u = f.pk
        f.resposta1 = selecionada
        f.save()
    else:
        selecionada = 'Escolha uma'

    context = {'respostaum': respostaum, 'selecionada': selecionada}

    return render(request, 'cheiro/primeira_pergunta.html', context)

这是我的模板:

<form method="POST">
    {% csrf_token  %}

    <label for="respostaum">Selecione unidade</label>
    <select class="form-control" id="respostaum" name="respostaum">
        {% for selecionada in respostaum %}
        <option value="{{ selecionada }}">{{ selecionada }}</option>
        {% endfor %}
    </select>
    <input type="submit">

</form>

我试着替换 selecionada = request.POST['selecionada']对于此selecionada = request.POST.get('selecionada')和intead返回错误,返回null

回溯:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/cheiro/primeira_pergunta/

Django Version: 2.1.5
Python Version: 3.6.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'apps.cheiro',
 'apps.core']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\ProgramData\Anaconda3\lib\site-packages\django\utils\datastructures.py" in __getitem__
  77.             list_ = super().__getitem__(key)

During handling of the above exception ('selecionada'), another exception occurred:

File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "C:\ProgramData\Anaconda3\lib\site-packages\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\graficos\quiz\apps\cheiro\views.py" in primeira_pergunta
  70.        selecionada = request.POST['selecionada']

File "C:\ProgramData\Anaconda3\lib\site-packages\django\utils\datastructures.py" in __getitem__
  79.             raise MultiValueDictKeyError(key)

Exception Type: MultiValueDictKeyError at /cheiro/primeira_pergunta/
Exception Value: 'selecionada'

Tags: djangoinpygetresponserequestcontribpost
2条回答

问题是request.POST['selecionada']不是表单字段。 表单只有一个字段: <select class="form-control" id="respostaum" name="respostaum">

试试这个:

if request.method == 'POST':
    respostaum = request.POST['respostaum']
    # removed selecionada = request.POST['selecionada']
# if respostaum != 'Escolha uma':
    f = Cheiro.objects.get(pk=my_list)
    u = f.pk
    f.resposta1 = selecionada
    f.save()
else:

或者另一个选项是,如果希望将返回的数据命名为selecionada,则可以将表单字段重命名为:

# template
<label for="selecionada ">Selecione unidade</label>
<select class="form-control" id="selecionada " name="selecionada ">
    {% for selecionada in respostaum %}
    <option value="{{ selecionada }}">{{ selecionada }}</option>
    {% endfor %}
</select>
<input type="submit">


# views.py
def primeira_pergunta(request):
   trans = Tranfer()
   my_list = trans.shared[0]
   respostaum = ['amarelo', 'vermelho', 'roxo', 'cinza']
   selecionada = 'amarelo'
   if request.method == 'POST':
       selecionada = request.POST['selecionada']
   # if selecionada != 'Escolha uma':
       f = Cheiro.objects.get(pk=my_list)
       u = f.pk
       f.resposta1 = selecionada
       f.save()
   else:
       selecionada = 'Escolha uma'

context = {'respostaum': respostaum, 'selecionada': selecionada}

return render(request, 'cheiro/primeira_pergunta.html', context)

views.py中尝试此代码,保持模板不变(如问题所示):

def primeira_pergunta(request):
    trans = Tranfer()
    my_list = trans.shared[0]
    respostaum = ['amarelo', 'vermelho', 'roxo', 'cinza']
    if request.method == 'POST':
        selecionada = request.POST['respostaum']
    #if selecionada != 'Escolha uma':
        f = Cheiro.objects.get(pk=my_list)
        u = f.pk
        f.resposta1 = selecionada
        f.save()

    context = {'respostaum': respostaum}

    return render(request, 'cheiro/primeira_pergunta.html', context)

相关问题 更多 >

    热门问题