2012-07-09 84 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], 
        } 
       )