2012-12-06 2 views
8

정말 장고 형식 세트가 혼란 스럽습니다.django formsets confusion (유효성 검사, 필수, empty_permitted)

나는 특히 난 정말 이해가 안 다음 개념에 문제가 오전 :

해당 formset는 이 변경되지 않은 여분의 형태를 무시하고 똑똑합니다.

너무 똑똑해 지려고하는 코드에 대해 말하기. 이게 정확히 무엇을 의미할까요? 내가 왜 그걸 원할거야?

그런 다음, 이전의 개념을 이해하려고, 난 사람들

이 필요한 formsets에서 양식을 참조하십시오.

이것은 내가 얻을 수없는 또 다른 개념입니다. formset에 필요한 양식은 무엇이며 양식을 요구해야하는 이유는 무엇입니까? 다시 문서화되지 않은 무언가.

다른 사람들이 가진 것처럼 보이는 내 실제 문제가 발생하지만 실제로 해결 한 이유를 설명 할 수는 없습니다.

왜 다음 예제에서는 formset이 유효하고 동일한 입력을 가진 개별 양식이 유효하지 않은 이유는 무엇입니까? False로 empty_permitted 설정 가능

import django 
class MyForm(django.forms.Form): 
    start = django.forms.DateField() 
    end = django.forms.DateField() 

data = { 
    'form-TOTAL_FORMS': '1', 
    'form-MAX_NUM_FORMS': '', 
    'form-INITIAL_FORMS': '0', 
    'form-0-start': '', 
    'form-0-end': '', 
} 

MyFormSet = formset_factory(MyForm) 
formset = MyFormSet(data) 
#fee_forms[0].empty_permitted = False 

print formset.is_valid() 
# --- returns True --- 
print formset.errors 

f = MyForm({'start': '', 'end': ''}) 
print f.is_valid() 
# --- returns False --- 
print f.errors 

합니다 (해당 formset 인해 '시작'과 '끝'을 누락 무효로하기위한 인) 나를 위해 예상되는 결과를 보인다. 이것은 다른 문서화되지 않은 기능입니다 ...

아무도 설명 할 시간이 없습니까?

당신에게

답변

12

해당 formset이 변경되지 않은 여분의 형태를 무시 똑똑 감사드립니다.

너무 똑똑해 지려고하는 코드에 대해 말하기. 이게 정확히 무엇을 의미할까요? 내가 왜 그걸 원할거야?

이 의미하는 것 - 아웃 작업으로 - (당신의 예에서 extra=N 포함)의 formset에 의해 만들어진 "추가"형태 True-empty_permitted 세트를 가지고있다. Have a glance at django/forms/formsets.py이 문제를 확인하십시오.

formset[0].empty_permittedformset[0].has_changed() == False이면 더 이상의 처리/유효성 검사가 수행되지 않는다는 것을 의미합니다. 다시 you can see this in action in forms/forms.py입니다.

, a blog post suggestsempty_permitted = False을 설정 modelformset_factory (또는 inlineformset_factory)에서 사용할 수있는 사용자 정의의 formset을 정의 방지하기위한 방법은 다음과 같습니다

class MyModelFormSet(BaseModelFormSet): 
    def __init__(self, *args, **kwargs): 
     super(MyModelFormSet, self).__init__(*args, **kwargs) 
     for form in self.forms: 
      form.empty_permitted = False 

나는 이것을 테스트하지 않은,하지만 합법적 보인다.

는 사람이 원하는 이유에 관해서는, 그것은 django-dynamic-formset 훨씬 간단 사용합니다 - 당신이 form-0form-2 및 데이터를 보낼 수 있습니다, 별도의 양식 (데이터 모델에 링크 되지 않음) form-1을 한 가정, 장고 '수상 불평하지 마라. empty_permitted이 기본값으로 False 인 경우 자신의 코드에서 빈 양식을 건너 뛰거나 Javascript로 다시 색인화하는 것에 대해 걱정해야합니다.

관련 문제