Django python Просмотр и форма - MultiValueDictKeyError at / result 'num1' - Почему моя форма не отправляет данные - PullRequest
2 голосов
/ 15 февраля 2020

Я создал форму для добавления двух чисел и получения MultiValueDictKeyError в / result 'num1'. Я пробовал много вещей, но не могу понять это. Я решил попробовать @App -> views.py:

    from django.shortcuts import render
    from django.http import HttpResponse
    from django.http import HttpRequest,HttpResponseRedirect
    from .models import Footprint

    # Create your views here.
    def index(request):
        foots = Footprint.objects.all()         
        return render(request, "index.html", {'foots': foots})

    def calc(request):
        val1 = int(request.POST['num1'])
        val2 = int(request.POST['num2'])
        res = val1 + val2
        return render(request,'result.html',{'result': res})

@ templates -> index. html файл, в котором я пишу свою форму:

    {% block content %}
    <form action="calc" method="post">
        {% csrf_token %}
        <p style="color:white;">Installation Cost:</p> <input type="text" name="num1">
        <p style="color:white;">Installation Year:</p> <input type="text" name="num2"><br><br>
        <p><a href="result" class="btn btn-primary btn-lg btn-custom">SUBMIT</a></p>

    </form>
    {% endblock %}

@result.html:

    {% block content %}
    Result: {{result}}
    {% endblock %}

@ здесь я получил ошибку

    MultiValueDictKeyError at /result
    'num1'
    Request Method: GET
    Request URL:    http://127.0.0.1:8000/result
    Django Version: 3.0.3
    Exception Type: MultiValueDictKeyError
    Exception Value:    
    'num1'
    Exception Location: C:\Users\scott\Envs\venv\lib\site-                        
    packages\django\utils\datastructures.py in __getitem__, line 78
    Python Executable:  C:\Users\scott\Envs\venv\Scripts\python.exe
    Python Version: 3.8.0
    Python Path:    
    ['C:\\Users\\scott\\projects\\marciano',
     'C:\\Users\\scott\\Envs\\venv\\Scripts\\python38.zip',
     'C:\\Users\\scott\\Envs\\venv\\DLLs',
     'C:\\Users\\scott\\Envs\\venv\\lib',
     'C:\\Users\\scott\\Envs\\venv\\Scripts',
     'c:\\users\\scott\\appdata\\local\\programs\\python\\python38\\Lib',
     'c:\\users\\scott\\appdata\\local\\programs\\python\\python38\\DLLs',
     'C:\\Users\\scott\\Envs\\venv',
     'C:\\Users\\scott\\Envs\\venv\\lib\\site-packages']
     Server time:   Fri, 14 Feb 2020 21:33:42 -0500



    Environment:

    Request Method: GET
    Request URL: http://127.0.0.1:8000/result

    Django Version: 3.0.3
    Python Version: 3.8.0
    Installed Applications:
    ['app1',
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles']
    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 (most recent call last):File "C:\Users\scott\Envs\venv\lib\site-    packages\django\utils\datastructures.py", line 76, in __getitem__
    list_ = super().__getitem__(key)

    During handling of the above exception ('num1'), another exception occurred:
      File "C:\Users\scott\Envs\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
      File "C:\Users\scott\Envs\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
      File "C:\Users\scott\Envs\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
      File "C:\Users\scott\projects\marciano\app1\views.py", line 14, in calc
    val1 = int(request.POST['num1'])
      File "C:\Users\scott\Envs\venv\lib\site-packages\django\utils\datastructures.py", line 78, in __getitem__
    raise MultiValueDictKeyError(key)

    Exception Type: MultiValueDictKeyError at /result
    Exception Value: 'num1'

1 Ответ

0 голосов
/ 15 февраля 2020

В ваших шаблонах кода -> index. html файл, в котором вы пишете форму, укажите изменение действия calc на result, а также удалите a и href и добавьте <button type='submit'>submit</button>

@index.html

{% block content %}
    <form action="result" method="post"> #here change the action 
        {% csrf_token %}
        <p style="color:white;">Installation Cost:</p> <input type="text" name="num1">
        <p style="color:white;">Installation Year:</p> <input type="text" name="num2"><br><br>
        <p><button type='submit' class="btn btn-primary btn-lg btn-custom">SUBMIT</button></p>
 # here  above you change the remove a and href='result' it reference and add submit button for submit the data
    </form>
{% endblock %}

@ apps -> url.py

path('result', views.calc, name='result'),  #here you name your url is result 

, поскольку вы называете свой URL-адрес, а также рекомендуется удалять жесткий код URL используйте этот шаблонный тег {% url%}

и используйте функцию get в вашем представлении, где вы получаете представления num1 и num2

@ views ->. py

def calc(request):
        val1 = int(request.POST.get('num1 ',1)) # here use the get method of dictionary see in python docs
        val2 = int(request.POST.get('num2',1)) # also same change use get method num2 is key and 1 is default value 
        res = val1 + val2
        return render(request,'result.html',{'result': res})

get() метод дает значение ключа, если метод не нашел ни одного ключа, он возвращает значение по умолчанию, здесь мы передаем 1, если мы не передаем значение по умолчанию это займет None

Здесь вы вносите изменения в свой код и, если он работает, сделаете правильный ответ на этот вопрос, в конце концов, дайте мне знать эту работу или нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...