with inlineformset_factory formmodel form example dynamically creating python django django-forms inline-formset

python - inlineformset_factory - formset django implementation



Prueba de métodos de limpieza InlineFormset (1)

Puede usar el método inlineformset_factory de django.forms.models para crear un formset en línea personalizado. Este método establece el valor de fk en su conjunto de formularios en función de la clase principal que se le transfirió.

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

Tenga en cuenta el parámetro formset=BracketInlineFormset al construir el formset con la fábrica.

Referencia: Django Docs

Tengo un proyecto de Django, con 2 modelos, una Structure y un corchete, el corchete tiene una clave externa a una estructura (es decir, de uno a muchos, una estructura tiene muchos corchetes). TabularInline un TabularInline para el sitio de administración, por lo que habría una tabla de corchetes en la estructura. Agregué un formset personalizado con algún método de clean personalizado para hacer una validación adicional, no puedes tener un Bracket que entre en conflicto con otro Bracket en la misma estructura, etc.

El administrador se ve así:

class BracketInline(admin.TabularInline): model = Bracket formset = BracketInlineFormset class StructureAdmin(admin.ModelAdmin): inlines = [ BracketInline ] admin.site.register(Structure, StructureAdmin)

El BracketInlineFormset solo tiene el método limpio:

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

Todo funciona, y la validación funciona.

Sin embargo, ahora quiero escribir alguna prueba unitaria para probar mi compleja lógica de validación de formset.

Mi primer intento para validar valores conocidos es:

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

Sin embargo, eso no funciona y plantea la excepción:

====================================================================== 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'' ----------------------------------------------------------------------

La documentación de Django (para la validación de formset) implica que uno puede hacer esto.

¿Cómo es que esto no está funcionando? ¿Cómo pruebo la limpieza () / validación personalizada para mi formset en línea?