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?