【问题标题】:KeyError when trying to assign clean_data value in Django尝试在 Django 中分配 clean_data 值时出现 KeyError
【发布时间】:2017-06-17 15:01:54
【问题描述】:

当我尝试分配 form.clean_data['value'] 时收到 KeyError 我正在尝试在 Django Web 应用程序中编写一个利息计算器脚本,它接受用户输入的初始资本年份和利率并计算最终资本,但是它返回一个关键错误。数据库是 sqlite3。

感谢您在解决方案和设计方面的任何帮助,无论是初学者还是所有人..

这是回溯

追溯:

文件 “/Users/Andras/miniconda3/lib/python3.5/site-packages/django/core/handlers/exception.py” 在内部 39. response = get_response(request)

文件 “/Users/Andras/miniconda3/lib/python3.5/site-packages/django/core/handlers/base.py” 在 _get_response 187. response = self.process_exception_by_middleware(e, request)

文件 “/Users/Andras/miniconda3/lib/python3.5/site-packages/django/core/handlers/base.py” 在 _get_response 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)

查询中的文件“/Users/Andras/myproject/myapp/views.py” 37. 初始 = form.cleaned_data['initial']

异常类型:KeyError at /query/ 异常值:'initial'

views.py

from django.shortcuts import redirect
from django.shortcuts import get_object_or_404, render
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.views import generic
from django.template.loader import get_template
from django.template import Context 
from django.views.generic.base import TemplateView 
from myapp.models import Queries
from django.core import serializers
import os, re, math
from django.template import Context
from django.views.generic import View
from django import forms
from myapp.forms import QueriesForm
import decimal
from django.http import Http404

def get_final(initial, rate, years):
    initial = self.initial
    rate = self.rate
    years = self.years
    calcInterest = (initial*(1+((rate/100)/12))^(12*years))
    final = calcInterest
    return final    


def query(request):
    if request.method == 'POST':

        form = QueriesForm(request.POST)

        if form.is_valid():

            initial = form.cleaned_data['initial']
            rate = form.cleaned_data['rate']
            years = form.cleaned_data['years']

            init1 = Queries.objects.get_initial()
            rate1 = Queries.objects.get_rate()
            years1 = Queries.objects.get_years()
            final1 = get_final(init1, rate1, years1)

            return render (request, 'result.html', {'cacl':final1})

        else:
        raise Http404
    else:

    form = QueriesForm()        

    return render(request, 'index.html', {'form': form})


def index(request):
    template_name = 'index.html'
    return render(request, "index.html", {})

def queries(request):
    template_name = 'queries.html'
    return render(request, "queries.html", {}) 

def result(request):
    template_name = 'result.html'
    return render(request, "result.html", {})

forms.py

from django import forms
from .models import Queries


class QueriesForm(forms.Form):


    initial = forms.NumberInput(attrs={'max_lenght':10, 'requred':True})
    years = forms.NumberInput(attrs={'max_lenght':10, 'requred':True})
    rate = forms.NumberInput(attrs={'max_lenght':10, 'requred':True})

def clean_message(self):
    initial = self.cleaned_data.get("initial")
    years = self.cleaned_data.get("years")
    rate = self.cleaned_data.get("rate")


class Meta:

    model = Queries
    fields = ('initial', 'years', 'rate',)

models.py

from django.db import models
from django.forms import ModelForm

class Queries(models.Model):

    initial = models.DecimalField(max_digits=3, decimal_places = 2)
    years = models.DecimalField(max_digits=3, decimal_places = 2)
    rate = models.DecimalField(max_digits=3, decimal_places = 2)

def get_initial(self):
    return self.initial

def get_years(self):
    return self.years

def get_rate(self):
    return self.rate

urls.py

from django.conf.urls import url
from . import views

app_name = 'myapp'
    urlpatterns = [
    url(r'^$', views.index, name = 'index'),
    url(r'^queries/', views.queries, name = 'queries'),
    url(r'^query/', views.query, name = 'query')

]   

index.html

{% load staticfiles %}
<!DOCTYPE html>
<head>
    <title>My Cool Savings Calculator</title>
<style>
 h1 {
  padding-bottom: 0em;
  margin-bottom: 0em;
}
table {
  padding-top: 0em;
  margin-top: 0em;
}
</style>
</head>
<body>
<h1>Savings Calculator</h1>

<table>
<form name = "form" action = "{% url 'myapp:query' %}" method='POST'>{% csrf_token %}
<tr>
      <td><label>Initial Capital:</label>

  <td><input type='number' name='initial'></input></td>

 </tr>
 <br>
 <tr>
  <td><label>Number of Years:</label>

  <td><input type='number' name='years' value='5'></input></td>

 </tr>
<br>
<tr>
  <td><label>Interest rate (annual):</label>

  <td><input type='number' name='rate' value='3.5'></input></td>

</tr>
<br>
<tr>
  <td></td>
  <td><input type='submit'></input></td>
</tr>
</form>
 </table>
{% block content %}
{% endblock %}

<h3>Check previous queries <a href='/queries'>here</a></h3>
</body>

结果.html

{% extends 'index.html' %}

{% block content %}


<h2>{{calc}}</h2>

{% endblock %}

【问题讨论】:

    标签: python html django django-forms


    【解决方案1】:

    您的 attrs 参数中有拼写错误,这可能是导致此问题的原因。

    尝试更改这三行:

    initial = forms.NumberInput(attrs={'max_lenght':10, 'requred':True})
    years = forms.NumberInput(attrs={'max_lenght':10, 'requred':True})
    rate = forms.NumberInput(attrs={'max_lenght':10, 'requred':True})
    

    到这里:

    initial = forms.NumberInput(attrs={'max_length':10, 'required':True})
    years = forms.NumberInput(attrs={'max_length':10, 'required':True})
    rate = forms.NumberInput(attrs={'max_length':10, 'required':True})
    

    【讨论】:

      【解决方案2】:

      如前所述,您可能需要更正表单字段中 max_length 和 required 的拼写。

      然后我认为您需要实际输出表单而不是像您所做的那样常规的 html 输入。

      <form action="{% url 'myapp:query' %}" method="post">
          {% csrf_token %}
          {{ form }}
          <input type="submit" value="Submit" />
      </form>
      

      然后也在你的views.py查询函数中抛出错误,你可能想使用.get和一个后备值。

      initial = form.cleaned_data.get('initial', 0)
      rate = form.cleaned_data.get('rate', 3.5)
      years = form.cleaned_data.get('years', 5)
      

      【讨论】:

      • 谢谢大家的回答,最后在纠正错别字并使用表格后弄清楚出了什么问题:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2018-02-05
      • 2018-01-18
      • 2020-09-11
      相关资源
      最近更新 更多