2012-01-24 14 views
5

Quiero tener un formulario vinculado de un objeto para usar el método is_valid. La razón es porque tengo algunos datos antiguos que deseo que los usuarios corrijan de acuerdo con las nuevas reglas de validación. Entonces, quiero reutilizar el código de los métodos de limpieza en mi formulario.¿Transformar un formulario independiente en uno enlazado?

Terminé la serialización de mi respuesta:

from django.utils import simplejson 
from django.core.serializers import serialize 

(...) 

fields_dict = simplejson.loads(serialize('json', [obj]))[0]['fields'] 
form = forms.MyForm(fields_dict) 
if form.is_valid 

Esto funciona, pero no parece muy Djangish. Además, parece ser un problema común, así que estaba buscando una forma mejor de hacerlo.

De acuerdo con la documentación traducir los datos de no unido a no unido no está destinado a suceder: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method Sin embargo, eso sería la solución más fácil para mí.

+0

Dime si lo hizo bien: tiene datos antiguos en algún lugar y ya que este fue salvado, las reglas de validación cambiaron. ¿Ahora quiere usar un ModelForm para volver a validar los datos antiguos y mostrar errores al usuario? – Martin

+0

¿De dónde viene 'obj'? Esto ayudará a determinar qué está pasando aquí. –

+0

Exactamente @Penthi. Creo que Oogles me dio lo que estoy buscando. Gracias –

Respuesta

11

Existe la función django.forms.models.model_to_dict de Django que convertirá su instancia de modelo existente en un diccionario de datos adecuado para enlazar a un ModelForm.

Esto probablemente sería más eficiente, y definitivamente más "Djangish", que serializar y deserializar el objeto.

Y si también crea el formulario con la palabra clave instance, sabrá actualizar el registro existente cuando se guarde.

Así:

from django.forms.models import model_to_dict 

... 

fields_dict = model_to_dict(obj) 
form = forms.MyForm(fields_dict, instance=obj) 
+1

Gracias! Esto es lo que estaba buscando. –

Cuestiones relacionadas