Python 尝试使用时引发密钥错误<;输入>;

Python 尝试使用时引发密钥错误<;输入>;,python,html,django,Python,Html,Django,我试图精简代码,使其不会过于混乱。 我希望从html表单接收重复的数量,并根据用户的身份创建尽可能多的条目。这里我想说,如果用户在“月”输入字段中说12,则连续支付12次 template.html: <form action="" method="post"> Name: {{ form.name }} Date: {{ form.date }} <input type="text" alt="months" name="months">

我试图精简代码,使其不会过于混乱。 我希望从html表单接收重复的数量,并根据用户的身份创建尽可能多的条目。这里我想说,如果用户在“月”输入字段中说12,则连续支付12次

template.html:
<form action="" method="post">
    Name: {{ form.name }}
    Date: {{ form.date }}
    <input type="text" alt="months" name="months">
    <input type="submit" alt="register" class="" value="Submit"/>
</form>

views.py
if request.method == "POST":
    form = CreateForm(request.POST)
    if form.is_valid():
        months = range(int(form.cleaned_data['months']))
        for m in months:
            line = LineItem(
            name    = form.cleaned_data['name'],
            date    = date.today() + relativedelta(months=m),
            )
        line.save()
    return HttpResponseRedirect('/lines')
    else:
        pass
else:
    pass
编辑:添加表单、固定语法、回溯

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/lines/

Django Version: 1.4.1
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'bet',
 'love')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/Users/Patrick/Dropbox/CrushFolder/tenant/love/views.py" in LinesAll
  33.           months = range(form.cleaned_data['months'])

Exception Type: KeyError at /lines/
Exception Value: 'months'

问题是,您返回的响应包含循环中的第一项

让我为循环分离这个。。注意,在底部,它将立即退出循环

                line = LineItem(
                name    = form.cleaned_data['name'],
                date    = date.today() + relativedelta(months=m),
                )
                line.save()
                return HttpResponseRedirect('/lines')

问题是,您返回的响应包含循环中的第一项

让我为循环分离这个。。注意,在底部,它将立即退出循环

                line = LineItem(
                name    = form.cleaned_data['name'],
                date    = date.today() + relativedelta(months=m),
                )
                line.save()
                return HttpResponseRedirect('/lines')
“月”
不是表单正在验证或检查的字段。这将解决您当前的问题:

if form.is_valid():
    # change:
    #months = range(int(form.cleaned_data['months']))
    # to:
    months = range(int(request.POST['months']))
但更重要的是:您不应该使用
ModelForm
。A) ,这是不必要的复杂性,B),这实际上不是用户设置用于创建
LineItem
实例的属性的表单。相反,这是一个表单,在该表单中,您将获取数据,然后使用这些数据驱动应用程序逻辑,该应用程序逻辑使用生成的值(即连续月份的偏移日期)实际构造
LineItem
实例。丢失模型表单,使用“名称”和“月份”字段创建一个常规表单,然后使用
表单。清理后的数据将包含您期望的项目(
“名称”
“月份”
),然后可以在
行项目()
-创建循环中使用这些项目。

“月份”
不是表单正在验证或检查的字段。这将解决您当前的问题:

if form.is_valid():
    # change:
    #months = range(int(form.cleaned_data['months']))
    # to:
    months = range(int(request.POST['months']))

但更重要的是:您不应该使用
ModelForm
。A) ,这是不必要的复杂性,B),这实际上不是用户设置用于创建
LineItem
实例的属性的表单。相反,这是一个表单,在该表单中,您将获取数据,然后使用这些数据驱动应用程序逻辑,该应用程序逻辑使用生成的值(即连续月份的偏移日期)实际构造
LineItem
实例。丢失ModelForm,使用“name”和“months”字段创建一个常规表单,然后使用
表单。清理的\u数据
将包含您期望的项目(
“name”
“months”
),然后可以在
LineItem()
-创建循环中使用这些项目。

您有
表单的数据示例吗?清理的\u数据
?也许在该方法上做一些调试日志记录,但是从您的代码中我无法判断发生了什么。请返回CreateForm的KeyError和classdef。我假设您的views.py缩进实际上不是这样的(这将是一个语法错误)。并且您的表单标记缺少一个方法;我不确定这是否是“削减”的一部分,但如果是的话,这是排除问题根源的一个重要部分。我真的不知道你所说的数据样本是什么意思,我正在发送数字。它以u'3'的形式返回3您是否有
表单的某种数据样本?也许在该方法上做一些调试日志记录,但是从您的代码中我无法判断发生了什么。请返回CreateForm的KeyError和classdef。我假设您的views.py缩进实际上不是这样的(这将是一个语法错误)。并且您的表单标记缺少一个方法;我不确定这是否是“削减”的一部分,但如果是的话,这是排除问题根源的一个重要部分。我真的不知道你所说的数据样本是什么意思,我正在发送数字。它返回3作为u'3'谢谢!当我将months=设为整数时,这对for循环很有帮助,但如果我尝试使用表单data,仍然会抛出一个关键错误。你是说我应该这样调用cleaned_data吗?谢谢!当我将months=设为整数时,这对for循环很有帮助,但如果我尝试使用表单data,仍然会抛出一个关键错误。你是说我应该这样调用cleaned_data吗?你说得对,它起作用了!但是如果我现在使用request.POST而不是form.cleaned_数据,这是否意味着我不能再使用form.cleaned_数据,或者我应该创建一个单独的视图来处理views.py文件中的数据清理?对-您应该使用form.cleaned_数据,但是months不是为
CreateForm
定义的表单字段之一。在我看来,用
months=forms.IntegerField()
name=forms.CharField(max_length=where)
定义一个常规的
forms.Form
子类。清理后的数据将得到您所期望的结果。您的权利成功了!但是如果我现在使用request.POST而不是form.cleaned_数据,这是否意味着我不能再使用form.cleaned_数据,或者我应该创建一个单独的视图来处理views.py文件中的数据清理?对-您应该使用form.cleaned_数据,但是months不是为
CreateForm
定义的表单字段之一。在我看来,用
months=forms.IntegerField()
name=forms.CharField(max_length=where)
定义一个常规的
forms.Form
子类。清理后的数据将达到您的预期效果。