2012-07-09 64 views
0

动机创建表单

我目前正在创建在Django待办事项列表应用练习时意外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> 

回答

1

嗯,这不是形式是如何工作的。你不应该首先处理POST参数,并且你不能像单独的字段那样传递数据。你只需要将request.POST按原样传递给表单实例化。

做一组多种相同形式的方法是使用formset。然后,您可以直接将POST数据传递给formset实例,并获取验证的表单。

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

+0

啊,难怪我找不到任何例子,其中一个形式是从关键字参数创建。因为我可以在模型和请求中使用关键字参数。POST是一个类似于字典的对象,我只是猜测我可以做同样的事情。 我的确了解了ModelForm,但是我的模型有很多我不想显示的字段,我不确定是否可以选择不经过太多工作而不显示它们。 无论如何,谢谢你的回应。 :) – 2012-07-09 20:03:01

+1

您可以使用modelform的内部Meta类中的'fields'选项来指定表单上您想要的字段。 – 2012-07-09 20:07:10

0

Django的形式。 初始化()接受一个“初始”关键字参数,你可以通过以下方式设置的形式的初始值:

form = AddItemForm(initial = { 
         'name':names[i], 
         'priority':priorities[i], 
         'due_date':due_dates[i], 
        } 
       )