Python 尝试使用时引发密钥错误<;输入>;
我试图精简代码,使其不会过于混乱。 我希望从html表单接收重复的数量,并根据用户的身份创建尽可能多的条目。这里我想说,如果用户在“月”输入字段中说12,则连续支付12次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">
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
子类。清理后的数据将达到您的预期效果。