formset.save(commit=False) no funciona en formularios de modificación de filas existentes, devuelve una lista vacía.

38 views
Skip to first unread message

nin...@gmail.com

unread,
May 16, 2009, 6:36:03 PM5/16/09
to Django-es
Muy buenas.

Uso modelformset_factory para generar formularios a partir de modelos,
y lo estoy usando para generar un formulario que modifique una fila ya
existente en la base de datos. La cuestión, es que también me interesa
poder modificar los datos introducidos por el usuario (en este caso,
para cambiar el Id para que en vede modificar la fila, se haga una
fila nueva, además de algunos cambios más). Para esto uso formset.save
(commit=False)

[CÓDIGO]
TheFormSet = modelformset_factory(Hardware, exclude=('father',
'first_father', 'published', 'stars', 'stars_votes', 'user', 'date'),
extra=0)
if request.method == 'POST':
querySET = Hardware.objects.filter(id=improve)
formset = TheFormSet(
request.POST,
request.FILES,
queryset = querySET
)
# No se envia el formulario, se "abre" para modificarlo...
if formset.is_valid():
formset_save = formset.save(commit=False)
else:
formset = TheFormSet(queryset=Hardware.objects.filter(id=improve))

[/CÓDIGO]

La cuestión es que, formset_save, la variable donde se guarda la
salida de formset.save(commit=False), tiene un listado vació, es
decir, [], al contrario de lo que suele ocurrir cuando se genera un
formulario para una fila nueva en la base de datos.
La gracia es que el formulario valida, incluso si uso formset.save(),
los datos se guardan perfectamente en la base de datos.

Me he quedado sin ideas... espero que alguien pueda arrojar un poco de
luz en este asunto :)

Un saludo, y gracias.

Andres Vargas - zodman

unread,
May 22, 2009, 6:48:13 PM5/22/09
to djan...@googlegroups.com
un formset es un array de forms...
si haces commit=false puedes recorrer los fomulario modificando la
informacion de ellos.

for i,form_ in enum(formset.forms):
form_.cleaned_data["nombre"] = " ya cambie el nombre del form %d" %i;
form_.save()

2009/5/16 nin...@gmail.com <nin...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages