2010-03-06 21 views
5
class JobForm(forms.ModelForm): 
    class Meta: 
     model = models.Job 

Esa era mi forma, ahora tratando de salvar que elevará una excepción, y tratando de validar que sólo falla sin errores ....Django forma de error

job = get_object_or_404(models.Job, pk=1) 
form = forms.JobForm(instance = job) 
try: 
    form.save() 
except: 
    print sys.exc_info() 

#=>(<type 'exceptions.AttributeError'>, AttributeError("'JobForm' object has no attribute 'cleaned_data'",), <traceback object at 0x1029dbb48>) 

intentado validar que:

if form.is_valid(): 
    form.save() 
else: 
    print 'error' 
    print form.errors, len(form.errors) 
#=> 'error' 
#=> 0 

¡De modo que el formulario no es válido, pero no hay errores! ¿Alguna idea?

+1

sería bueno ver el modelo de trabajo y los datos reales que se publica –

Respuesta

18

Su formulario definitivamente no está encuadernado. Lea acerca de Bound and Unbound forms.

De esa documentación:

para enlazar datos a un formulario, pasar los datos como un diccionario como el primer parámetro a su Formulario constructor de la clase.

Eso significa que también el cambio de un campo en su modelo no hace que el formulario esté encuadernado. Tienes que pasar esos valores explícitamente a través del constructor. Pero:

Tenga en cuenta que el paso de una diccionario vacío crea una forma unida con los datos vacíos

y considerar esta

Si tiene una instancia de forma unida y quiere cambie los datos de alguna manera, o si quiere enlazar una instancia de formulario independiente a algunos datos, crear otra F instancia de orm. No hay forma de cambiar datos en una instancia de Formulario. Una vez que se ha creado una instancia de Formulario, debe considerar sus datos inmutables, ya sea que tenga datos o no.

Si valida una forma no unido:

No tiene sentido para validar un formulario sin datos, pero, para que conste, esto es lo que sucede con las formas no unidas:

>>> f = ContactForm()
>>> f.is_valid()
False
>>> f.errors
{}

+0

Estoy pasando 'request.POST' a mi formulario, y definitivamente se están enviando datos. ¿Alguna idea de por qué esto no está funcionando? – CodyBugstein

+0

Me ahorró tanto tiempo, recibí un error de validación pero nada en los errores. Esto absolutamente respondió por qué. –

3

Mi mejor versión es que no puede guardar un formulario de modelo que solo se ha creado con datos de instancia (lo intenté con uno de mis formularios y obtuve el mismo error) porque un formulario no se convierte una forma consolidada hasta que ingrese información adicional. Realmente no tiene sentido proporcionar solo datos que ya existen en el modelo a un formulario (y luego guardarlo de nuevo) ya que no habría ningún cambio. Si esto proviene de un formulario html, también debe pasar request.POST (o request.GET) al formulario.

+1

La documentación tiene un ejemplo que acaba de recuperar el modelo y pasar al formulario y luego guarda el formulario http://docs.djangoproject.com/en /1.1/topics/forms/modelforms/#the-save-method, específicamente después de este comentario # Cree un formulario para editar un artículo existente. De todos modos, probé lo que sugeriste al hacer job.state = 'RUNNING', luego lo pasé al formulario pero ocurrió el mismo error. Estoy usando urllib2 para enviar esa solicitud POST de todos modos. – khelll

+0

No estoy seguro de por qué lo proporcionan como un ejemplo (al menos guardarlo), porque no parece posible. Para guardar el formulario, deberá proporcionar el diccionario POST como primer parámetro. Para guardar el formulario, is_bound y is_valid() deberían devolver True. – Adam

+0

La documentación se ha actualizado para eliminar el ejemplo incorrecto. –