2012-11-21 2 views
5

두 모델 (StructureBracket)이 포함 된 Django 프로젝트가있는 경우 브래킷에 구조에 대한 외부 키가 있습니다 (일대 다 구조에는 하나의 괄호가 많이 있음). 나는 관리 사이트에 대해 TabularInline을 만들었으므로 구조에 대괄호 표가있게됩니다. 난 당신이 같은 구조에 다른 브라켓과 충돌하는 브라켓이없는 수있는 몇 가지 추가 검증을 할 수있는 몇 가지 사용자 정의 clean 방법의 formset 사용자 정의 추가 등InlineFormset 클린 메서드를 테스트합니다.

관리자는 다음과 같습니다

class BracketInline(admin.TabularInline): 
    model = Bracket 
    formset = BracketInlineFormset 

class StructureAdmin(admin.ModelAdmin): 
    inlines = [ 
     BracketInline 
    ] 
admin.site.register(Structure, StructureAdmin) 

class BracketInlineFormset(forms.models.BaseInlineFormSet): 
    def clean(self): 
     … my clean code here … 

모든 작품 및 검증 작업 :

BracketInlineFormset은 깨끗한 방법이있다.

그러나 지금은 복잡한 formset 유효성 검사 로직을 테스트하기 위해 unittest를 작성하고 싶습니다. 작동하지 않습니다 그러나

data = {'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MAX_NUM_FORMS': '', 'form-0-field1':'good-value', … } 
formset = BracketInlineFormset(data) 
self.assertTrue(formset.is_valid()) 

과 예외 제기 : 알려진 좋은 값을 검증 할 수

내 첫 번째 시도이다

====================================================================== 
ERROR: testValid (appname.tests.StructureTestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/paht/to/project/tests.py", line 494, in testValid 
    formset = BracketInlineFormset(data) 
    File "/path/to/django/forms/models.py", line 672, in __init__ 
    self.instance = self.fk.rel.to() 
AttributeError: 'BracketInlineFormset' object has no attribute 'fk' 

---------------------------------------------------------------------- 

(가) Django documentation (해당 formset 확인을 위해) 일을 수행 할 수 있습니다 의미를 이 작업을 수행.

어떻게 작동하지 않습니까? 인라인 formset에 대한 사용자 정의 clean()/유효성 검사를 테스트하려면 어떻게합니까?

+0

어떤 모양의 BracketInlineForm의 선언입니까? –

+0

@JohnMee 인라인 formset 코드가 질문에 추가되었습니다. – Rory

답변

4

django.forms.models의 inlineformset_factory 메소드를 사용하여 사용자 정의 인라인 formset을 만들 수 있습니다. 이 메소드는 전달 된 상위 클래스를 기반으로 formset에 fk 값을 설정합니다.

structure = StructureFactory() #foreign key 
data = {'form-TOTAL_FORMS': '1', 'form-INITIAL_FORMS': '0', 'form-MAX_NUM_FORMS': '', 'form-0-field1':'good-value', … } 
BIFormset = inlineformset_factory(Structure, Bracket, formset=BracketInlineFormset) 
formset = BIFormset(data, prefix='form', instance=structure) 
self.assertTrue(formset.is_valid()) 

팩토리를 사용하여 formset을 구성하는 동안 formset=BracketInlineFormset 매개 변수에 유의하십시오.

참조 : Django Docs