Tengo una página que muestra múltiples Formsets, cada uno de los cuales tiene un prefijo. Los conjuntos de formularios se crean utilizando formset_factory
las opciones predeterminadas, incluido extra=1
. Las filas se pueden agregar o eliminar con JavaScript.formset de Django: ¿muestra campos adicionales solo cuando no hay un conjunto de datos inicial?
Si el usuario agrega datos nuevos, aparece una fila en blanco. Perfecto.
Si el usuario ha agregado datos pero la validación del formulario ha fallado, en cuyo caso el formset se llena con datos POST usando MyFormset(data, prefix='o1-formsetname')
etc., solo se muestran los datos que han ingresado. De nuevo, perfecto. (el o1
etc. se genera dinámicamente, cada o
corresponde a una "opción", y cada "opción" puede tener múltiples conjuntos de formularios).
Sin embargo, si el usuario está editando los datos existentes, en cuyo caso el punto de vista rellena el juego de formularios utilizando MyFormset(initial=somedata, prefix='o1-formsetname')
donde somedata
es una lista de dicts de datos que provenían de un modelo en la base de datos, una línea en blanco adicional se inserta después de estos datos . No quiero que aparezca una fila en blanco a menos que el usuario agregue explícitamente uno usando JavaScript.
¿Hay alguna manera simple de evitar que el formset muestre una fila adicional si se establecen los datos iniciales? La razón por la que estoy usando initial
en el tercer ejemplo es que si acabo de pasar los datos usando MyFormset(somedata, prefix='o1-formsetname')
tendría que hacer un paso adicional de reformatear todos los datos en un dict de estilo POSTdata incluyendo prefijos para cada campo, por ejemplo o1-formsetname-1-price: x
etc., así como el cálculo de los datos del formulario de gestión, que agrega una gran cantidad de complicaciones.
Una solución podría ser para interceptar el juego de formularios antes de que sea enviado a la plantilla y quitar manualmente la fila, pero el atributo extra_forms
no parece tener permiso de escritura y el establecimiento de extra
a 0
no hace ninguna diferencia. También podría hacer que JavaScript detecte este caso y elimine la fila. Sin embargo, no puedo evitar pensar que me estoy perdiendo algo obvio, ya que el comportamiento que quiero es lo que a mí me parece una conducta razonable.
Gracias.
Estoy usando Django 1.1, donde el parámetro 'max_num' se comporta de manera diferente; ver la respuesta a continuación. – garybryan