2014-06-17 44 views
2

Formset is_valid returns「雖然字段爲空時Form類只有一個字段
我使用」 python manage.py shell「
如您所見,當」ArticleForm「類只有標題字段時,formset的is_valid函數返回」True「。
由於此問題,我看到有人使用has_changed函數。
但我不認爲這是解決這個問題的好方法。
Django Formset is_valid雖然當Form類只有一個字段時該字段爲空,但該字段爲空

from django import forms 
from django.forms.formsets import formset_factory 

class ArticleForm(forms.Form): 
    title = forms.CharField() 

ArticleFormSet = formset_factory(ArticleForm) 
data = { 
    'form-TOTAL_FORMS': '2', 
    'form-INITIAL_FORMS': '0', 
    'form-MAX_NUM_FORMS': '', 
    'form-0-title': 'Test', 
    'form-1-title': '', 
} 

formset = ArticleFormSet(data) 
formset.is_valid() 
#True - I think it has to be "False" because the "form-1-title' is empty 
formset.errors 
#[{}, {}] 

class ArticleForm(forms.Form): 
    title = forms.CharField() 
    pub_date = forms.DateField() 

ArticleFormSet = formset_factory(ArticleForm) 
data = { 
    'form-TOTAL_FORMS': '2', 
    'form-INITIAL_FORMS': '0', 
    'form-MAX_NUM_FORMS': '', 
    'form-0-title': 'Test', 
    'form-0-pub_date': '1904-06-16', 
    'form-1-title': '', 
    'form-1-pub_date': '1904-06-16', 
} 

formset = ArticleFormSet(data) 
formset.is_valid() 
#False - It's working. I think the reason is the pub_date field. 
formset.errors 
#[{}, {'title': [u'This field is required.']}] 

回答

4

這是空表單上的默認Django行爲。如果Django注意到你有一個完全空的表單,它在運行驗證時忽略它。在你的第二個例子中,你的表單不是空的,因爲DateField有一個值集。

如果你看看Django內聯,你可以看到這種行爲的優點。試想你已經在你的InlineAdmin中設置了

extra = 3 

。用戶填寫2個內聯表格並留下第三個。然後這兩種形式被正確地驗證,並且空的一個被忽略,正如人們所期望的那樣。

爲了驗證一個場形狀,你可以檢查你的cleaned_data:

if formset.is_valid(): 
    is_really_valid = True 
    for form in formset.forms: 
     if not form.cleaned_data.has_key('title'): 
      is_really_valid = False 
      break 

,如果這是一個外地的形式,它並沒有真正傷害了很多檢查一個字段。