Django python 视图和表单 - MultiValueDictKeyError at /result 'num1' - 为什么我的表单不会提交数据



我创建了一个表单来添加两个数字并在/result 处接收 MultiValueDictKeyError "数字1"。 我尝试了很多东西,但无法弄清楚。 我想我会试一试。

@project -> url.py:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from datetime import datetime
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('app1.urls')),
path('result', include('app1.urls')),
]
urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

@App-> url.py:

from django.urls import path, include
from django.conf.urls import include, url
from django.conf import settings
from django.conf.urls.static import static
from . import views
from . import urls
from app1.models import Footprint
import app1.views

urlpatterns = [
path("", views.index, name="index"),
path('result', views.calc, name='result'),
]

@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 -> 索引.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 %}

@here我收到错误

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:UsersscottEnvsvenvlibsite-                        
packagesdjangoutilsdatastructures.py in __getitem__, line 78
Python Executable:  C:UsersscottEnvsvenvScriptspython.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:UsersscottEnvsvenvlibsite-    packagesdjangoutilsdatastructures.py", line 76, in __getitem__
list_ = super().__getitem__(key)
During handling of the above exception ('num1'), another exception occurred:
File "C:UsersscottEnvsvenvlibsite-packagesdjangocorehandlersexception.py", line 34, in inner
response = get_response(request)
File "C:UsersscottEnvsvenvlibsite-packagesdjangocorehandlersbase.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:UsersscottEnvsvenvlibsite-packagesdjangocorehandlersbase.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:Usersscottprojectsmarcianoapp1views.py", line 14, in calc
val1 = int(request.POST['num1'])
File "C:UsersscottEnvsvenvlibsite-packagesdjangoutilsdatastructures.py", line 78, in __getitem__
raise MultiValueDictKeyError(key)
Exception Type: MultiValueDictKeyError at /result
Exception Value: 'num1'

在代码模板中 -> index.html在其中编写表单的文件中指定操作更改calcresult,并删除ahref并添加<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 函数,您可以在其中获取num1num2

@views -> 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

在这里,您对代码进行了更改,如果它有效,则最终让我知道这项工作

最新更新