0

动机

我目前正在 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'

我不明白发生了什么,因为我确实优先作为 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>
4

2 回答 2

1

好吧,这不是表单的工作方式。您不应该首先处理 POST 参数,并且您不能将单个字段的数据作为这样的参数传递。您只是应该按原样传递request.POST到表单实例化中。

做一组多个相同表单的方法是使用formset。然后,您可以将 POST 数据直接传递到 formset 实例化中,并获取经过验证的表单。

请注意,由于您的表单被用于创建模型实例,您可能需要考虑使用模型表单和模型表单集,在同一页面上)。

于 2012-07-09T19:58:25.393 回答
0

Django 表单。init () 接受一个 'initial' 关键字参数,您可以通过以下方式设置表单的初始值:

form = AddItemForm(initial = {
                      'name':names[i],
                      'priority':priorities[i],
                      'due_date':due_dates[i],
                   }
               )
于 2013-09-22T08:10:42.767 回答