2010-12-19 4 views
9

나는 formset에 약간 문제가 있습니다.장고 및 빈 formset이 유효합니다

페이지에 여러 개의 서식 세트를 표시해야하며 각 서식 세트에는 여러 가지 양식이 있어야합니다. 내가 페이지를 제출할 때

#GET 
for prod in products: 
    ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount) 
    formsset.append(ProductFormSet(prefix="prod_%d"%prod.pk)) 

#POST 
for prod in products: 
    ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount) 
    formsset.append(ProductFormSet(request.POST,prefix="prod_%d"%prod.pk)) 

문제에서, 빈 상자 형태는 (체크 없음) '자동'유효 하지만 하나 개의 형태로 하나 개의 필드를 채울 경우, 검사는 다음과 같습니다 그래서 내가 그런 일을했다 그것에서 작동합니다.

왜 그런지 모르겠으니 아무도 아이디어가 없다면

감사합니다.

답변

19

다른 문제를 조사하면서이 질문에 부딪 혔습니다. 내 문제에 대한 해결책을 찾기 위해 Django 소스를 파헤 치면서이 질문에 대한 답을 찾았으므로 여기에서 문서화하겠습니다 :

양식에 빈 값이 허용되면 (이것은 포함 된 빈 양식에 적용됩니다 form 세트 내에서) 제출 된 값이 초기 값에서 변경되지 않은 경우 유효성 검증을 건너 뜁니다. (장고 1.2 라인 265) 장고에/양식/forms.py을 full_clean() 메소드를 확인하십시오

# If the form is permitted to be empty, and none of the form data has 
# changed from the initial data, short circuit any validation. 
if self.empty_permitted and not self.has_changed(): 
    return 

을 당신이 찾고있는 솔루션의 종류를 모르겠어요 (또한,이 질문은 이미 다소 날짜가 있음) 그러나 아마도 이것은 미래에 누군가를 도울 것입니다.

+0

감사합니다. 내 문제를 해결하기 위해 솔루션을 사용했습니다. 빈 양식은 유효성을 검사해서는 안됩니다. 내 예를 보아라. –

2

"formset_factory"의 "extra"매개 변수를 기반으로 작성된 양식의 "empty_permitted"속성은 True로 설정됩니다. (참조 : formset.py 라인 123)

# Allow extra forms to be empty. 
    if i >= self.initial_form_count(): 
     defaults['empty_permitted'] = True 

는 그래서 "초기"는 해당 formset의 매개 변수가 아닌이 사용 사례에 대한 "formset_factory"의 "추가"매개 변수를 사용할 수있는 더 좋은 방법을 보인다.

using-initial-data-with-a-formset

10

@Jonas, 감사에 대한 설명을 찾아주세요. 내 문제를 해결하기 위해 당신의 설명을 사용했습니다. 비어있을 때 유효성을 검사하지 않는 양식이 필요했습니다. (자바 스크립트로 추가 된 양식)

class FacilityForm(forms.ModelForm): 
    class Meta: 
     model = Facility 

    def __init__(self, *arg, **kwarg): 
     super(FacilityForm, self).__init__(*arg, **kwarg) 
     self.empty_permitted = False 


facility_formset = modelformset_factory(Facility, form=FacilityForm)(request.POST) 

제출할 때 표시된 양식이 비어 있어서는 안됩니다.

+1

'empty_permitted'는 __init__ 메쏘드의 인자이므로, 호출 할 때'form_kwargs'를 사용하고 서브 클래스 예제에서 __init__ 메쏘드를 만들지 않아도됩니다. ' – Bobort

+0

form_kwargs는 django 버전 1.9 이상에서 사용할 수 있습니다. ('form_kwargs = {'empty_permitted ': False} –