2012-11-21 12 views
5

Mam projekt Django, z 2 modelami, Structure i Bracket, Bracket ma ForeignKey do struktury (tj. Jeden-do-wielu, jedna Struktura ma wiele nawiasów). Stworzyłem dla strony administratora TabularInline, aby na Strukturze znajdowała się tabela nawiasów. I dodaje niestandardowe formset z jakimś niestandardowym clean metodą zrobić kilka dodatkowych walidacji, nie można mieć wsporniku, który jest niezgodny z innego wspornika na tej samej strukturze itpTestowanie metod InlineFormset clean

Administrator wygląda następująco:

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

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

BracketInlineFormset właśnie ma czyste metody:

To wszystko działa, a prace walidacji.

Jednak teraz chcę napisać kilka unittest, aby przetestować moją złożoną logikę walidacji formset.

Moja pierwsza próba do sprawdzania znane, dobre wartości to:

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()) 

jednak, że nie działa i pojawia się wyjątek:

====================================================================== 
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 (dla formset walidacji) implikuje można Zrób to.

Dlaczego to nie działa? Jak przetestować niestandardowy clean()/sprawdzanie poprawności dla mojego wbudowanego zestawu formularzy?

+0

Co deklaracja BracketInlineFormset wyglądać? –

+0

@JohnMee wbudowany kod zestawu formularzy dodany do pytania – Rory

Odpowiedz

4

Można użyć metody inlineformset_factory z django.forms.models, aby utworzyć niestandardowy wbudowany zestaw formularzy. Ta metoda ustawia wartość fk do twojego zestawu formularzy na podstawie przekazanej mu klasy nadrzędnej.

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()) 

Uwaga parametr formset=BracketInlineFormset podczas konstruowania formset z fabryki.

referencyjny: Django Docs