2011-05-12 23 views
1

好的,所以我有一個有效的formset。但給了我一個錯誤在於,形成有沒有屬性cleaned_data ..formset有效,但表單沒有屬性cleared_data!

老實說,我完全不知道發生了什麼事..
我想我的終端代碼,並返回一個空字典..沒有錯誤..

形式:

class Clinical(forms.Form): 
    _names = list(ClinicalForm.objects.values_list('form_id', 'form_name')) 
    _names.append(("New", u'Nova entrada')) 

    cliform_name = forms.ChoiceField(widget=RadioSelect(), choices=_names, label 
     ="", required=True) 

觀點:

ClinicalSet = formset_factory(Clinical, extra=2) 

formset2 = ClinicalSet(request.POST) 
if formset2.is_valid(): 
    choice1 = formset2.cleaned_data 
    return render_to_response('valid_test.html', 
           { 
            'formset2': formset2, 
            'wrongs1': wrongs1, 
            'choice1': choice1 
            }) 
else: 
    formset2 = ClinicalSet() 
return render_to_response('valid_test.html', 
          { 
           'formset2': formset2, 
           'wrongs1': wrongs1, 
           })  

模板:

<form method="post" action=""> 
<div> 
{{ formset2.management_form }} 
    {% for form in formset2.forms %} 
     {{ form }} 
    {% endfor %} 
    <input type="submit" value="save" /> 
</div> 

如果我評論在cleaned_data被稱爲(選擇1)行,我沒有收到任何錯誤,我能看到的形式..
如果我選擇一些選項和去掉這一行,它的工作原理..

我有一個類似的formset:both forms in formset need to be selected和這一個工程..

其工作原理是在第一表單集(上面鏈接)的形式。崗位參數:

form-0-pres_name 1 
form-1-pres_name 2 
form-INITIAL_FORMS 0 
form-TOTAL_FORMS 2 

用戶選擇每個窗體一個選項,他重定向到另一個觀點(這一個 - formset2)。

任何幫助都更受歡迎..

+0

什麼Django的版本是你使用?這應該在1.3中修復:https://code.djangoproject.com/ticket/11418 – 2011-05-12 15:28:52

+0

humm我正在使用1.1。 BUt我已經有一個formset工作。非常像這一個,但裏面的數據是不同的 – pavid 2011-05-12 15:30:30

+0

在看到@Mark Lavin提到的票據後,我會說這是一個相當安全的賭注,這是你的問題。我無法說出你的其他formset的工作原理或方式,但你應該修改你的代碼,通過'hasattr'檢查'cleaned_data'的存在並作出相應的響應。 – 2011-05-12 16:13:14

回答

2

formset_factory返回一個迭代器的形式,即基本形式的列表,它不是一個形式本身。 cleaned_data只是形式,所以你必須遍歷formset2

for form in formset2: 
    form.cleaned_data # Here I am! 
+0

這給了我同樣的錯誤。其實我以前已經嘗試過了。爲什麼我不明白這個錯誤是因爲我有一個類似的formset和formset的作品。我去了編輯我的問題,讓這個清除 – pavid 2011-05-12 15:33:20

+0

那麼你是說這只是初始視圖產生的錯誤?當你說「如果我選擇一些選項,並取消註釋這條線,它的工作..」你的意思是提交表單之前取消註釋行? – 2011-05-12 16:09:38

+0

此錯誤出現在我能夠看到表單之前。如果我對行choice1 = formset2.cleaned_data發表評論,我會看到表單並且可以選擇,並且帖子會返回我選擇的值。但是,如果我取消註釋該行(以便能夠訪問這些值並使用它們)並重新啓動該過程,則錯誤仍會繼續 – pavid 2011-05-12 16:16:49

0

如果有人需要,這裏有我的觀點做了修改:

ClinicalSet = formset_factory(Clinical, extra=tamanh) 

#size of this list will determine number of forms 
wrongs = iter(wrong) 
formset = ClinicalSet(request.POST) 
dic = {} 
if formset.is_valid(): 
    if len(request.POST.keys()) == 0: 
     return render_to_response('valid.html', 
             { 
              'formset': formset, 
              'wrongs': wrongs }) 
    else: 
     #+ 2 because of TOTAL_FORMS and MAX_NUM_FORMS 
     if len(request.POST.keys()) != len(wrongs) + 2: 
      msg = "You have to select something in all forms!!" 
      return render_to_response('valid.html', 
              { 
               'formset': formset, 
               'wrongs': wrongs, 
               'msg': msg }) 
     else: 
      for n in range(tamanh): 
       #result post into a dictionary, since cleaned_data doesn't work 
       dic[wrongs.next()] = request.POST['form-' + str(n) + '-cliform_name'] 
       return HttpResponseRedirect(reverse('valid2', args=[word])) 
    else: 
     formset = ClinicalSet() 
    return render_to_response('valid.html', 
           { 
            'formset': formset, 
            'wrongs': wrongs, 
            'msg': msg 
            }) 
+0

如果表單中的表單包含FileField,你會怎麼做?在這種情況下,你不能使用'request.POST'。我嘗試了'request.FILES',但沒有運氣。 – shailenTJ 2013-09-13 14:52:25

+0

我從來沒有嘗試過一個Formset中的FileField。我想這一定很棘手.. – pavid 2013-09-14 09:49:39