2014-06-17 1 views
2

Form Class가 하나의 필드 만 가질 경우 Formet is_valid가 "True"를 반환합니다.
이 예제에서는 " python manage.py shell "
"ArticleForm "클래스에 title 필드 만있는 경우 formset의 is_valid 함수가"True "를 반환합니다.
이 문제로 인해 누군가 has_changed 함수를 사용하는 것을 보았습니다.
하지만 이 문제를 해결하는 좋은 방법이라고 생각하지 않습니다.
Django Formset is_valid는 양식 클래스에 단 하나의 필드가있을 때 필드가 비어 있지만 "True"를 반환합니다.

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가 완전히 비어있는 양식을 발견하면 유효성 검사를 실행할 때이를 무시합니다. 두 번째 예제에서는 DateField에 값이 설정되어 있기 때문에 양식이 비어 있지 않습니다.

장고 인라인을 살펴 본 경우이 동작의 이점을 확인할 수 있습니다. 당신이 설정했다고 상상해보십시오. InlineAdmin에

을 입력하십시오. 사용자는 두 개의 인라인 양식을 채우고 세 번째 양식은 생략합니다. 그러면 두 양식이 올바르게 검증되고 공백은 예상대로 무시됩니다. 당신이 당신의 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 

이것은 하나 개의 필드의 형태 인 경우, 그것은 정말 하나 개의 필드를 확인하기 위해 많이 다치게하지 않습니다.

관련 문제