动机
我目前正在django中为练习创建一个待办事项列表应用程序。我现在要做的是给“用户”提供一次提交多个待办事项的选项。为此,我多次显示表单,然后分别从每个表单中检索项目。
尝试&错误
以下是相关表格:
class AddItemForm(forms.Form):
name = forms.CharField(max_length=60, label='Item Name')
priority = forms.IntegerField(required=False,
widget=forms.Select(choices=Item.PRIORITY))
due_date = forms.DateTimeField(required=False, label='Due Date')
但是,当我尝试使用关键字参数创建表单时(感兴趣的行在for循环中):
def add_item(request):
if request.method == 'POST':
r = request.POST
names = r.getlist('name')
priorities = r.getlist('priority')
due_dates = r.getlist('due_date')
for i in xrange(len(names)):
form = AddItemForm(
name=names[i],
priority=priorities[i],
due_date=due_dates[i],
)
if form.is_valid():
item = form.cleaned_data
Item.objects.create(**item)
return HttpResponseRedirect('/todo')
form = AddItemForm()
try:
num_items = xrange(int(request.GET.get('n', 1)))
except ValueError:
num_items = xrange(1)
return render(request, 'add_item.html',
{'form': form, 'num_items': num_items})
我收到以下错误消息:
Exception Type: TypeError
Exception Value:
__init__() got an unexpected keyword argument 'priority'
我不明白发生了什么,因为我将 priority 作为AddItemForm中的字段。
HTML
如果有帮助,这是模板html:
<!DOCTYPE html>
<html>
<head> <title>Add item</title> </head>
<body>
<form method="post">{% csrf_token %}
{% for i in num_items %}
<div>{{ form }}</div>
{% endfor %}
<input type="submit">
</form>
<br><br>
<form action="/todo" method="get">
<input type="submit" value="Go back to To-Do List">
</form>
</body>
</html>
答案 0 :(得分:1)
嗯,这不是表单的工作方式。您不应该首先处理POST参数,并且不能将各个字段的数据作为参数传递。您应该按原样将request.POST
传递给表单实例化。
执行一组多个相同表单的方法是使用formset。然后,您可以将POST数据直接传递到formset实例化,并获取验证的表单。
请注意,由于您的表单用于创建模型实例,因此您可能需要考虑在同一页面上使用modelform(和模型表单集)。
答案 1 :(得分:0)
Django表单。 init ()接受'initial'关键字参数,您可以通过以下方式设置表单的初始值:
form = AddItemForm(initial = {
'name':names[i],
'priority':priorities[i],
'due_date':due_dates[i],
}
)