2010-10-06 26 views
10

Ok, he estado mirando esto durante horas tratando de descubrir qué está pasando, fue en vano. Estoy intentando crear un ModelForm usando la palabra clave 'instancia' para pasarle una instancia de modelo existente y luego guardarla. Aquí es el ModelForm (despojado considerablemente del original en mis intentos de identificar la causa de este problema):Django ModelForm falla la validación sin errores

class TempRuleFieldForm(ModelForm): 
    class Meta: 
     model = RuleField 

y aquí está el código que estoy ejecutando:

>>> m = RuleField.objects.get(pk=1) 
>>> f = TempRuleFieldForm(instance=m) 
>>> f.is_valid() 
False 

El objeto modelo (m arriba) es válido y guarda bien, pero el formulario no se validará. Ahora, hasta donde puedo decir, este código es idéntico al ejemplo de Django docs que se encuentra aquí: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method, aunque obviamente me falta algo. Agradecería mucho algunos ojos frescos para decirme lo que tengo mal.

Gracias

+2

¿Qué imprime 'f.errors'? – sdolan

Respuesta

21

Tenga en cuenta que su enlace no llama f.is_valid(), sólo se guarda directamente. Esto es potencialmente un poco engañoso.

El punto es que instanciar una forma con sólo un parámetro instance pero no data hace no se unen a los datos, y la forma, por tanto, no es válido. Verá que f.is_bound es False.

Detrás de escena, instance es realmente lo mismo que pasar los datos initial, que como la nota de documento solo se usa para mostrar los datos inicialmente y no se usa para guardar. Probablemente se beneficiaría al leer el notes on bound and unbound forms.

+3

+1. "instancia no implica obligado": este es el razonamiento correcto. –

+0

Gracias, eso tiene perfecto sentido. Sabía que sería algo simple ... – oogles

+0

Solo por aclaración, la razón por la que estaba usando f.is_valid() fue simplemente para hacer la pregunta más concisa. El uso de f.save() falla con un AttributeError en el campo clean_data, que no existe hasta que el formulario se valida. Así que incluso cuando estaba usando el código _exactly_ como está en el enlace que publiqué (usando f.save() en lugar de f.is_valid()) todavía estaba fallando. – oogles

3

Si aún quiere validar el objeto que estaba en la base de datos, puede serializarlo primero y luego crearlo con él.

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 no es probablemente la mejor manera de hacerlo, pero el único que he encontrado para conseguir un formulario dependiente de un modelo. Lo necesito porque quiero validar los datos actuales en la base de datos. Creo una pregunta ya que no creo que esta es la mejor manera de hacerlo:

Transform an unbound form to a bound one?

+2

me faltaba toda la información de "vincular datos al formulario", que es lo que está logrando con la serialización . Creo que django.forms.models.model_to_dict de Django sería mejor que dicha serialización, sin embargo, ver mi respuesta a su pregunta: [link] (http://stackoverflow.com/questions/8993749/transform-an-unbound-form-to -a-bound-one # 8996585). – oogles

0

Esto no es una solución para OP, pero es para el título de la entrada, que es bastante alto en Google. Así que voy a publicar de todos modos, desde here:

Si ya está dando request.POST a su formulario utilizando request.POST or None, pero sigue siendo válido y sin errores, compruebe que no hay ninguna redirección pasando. Una redirección pierde tus datos POST y tu formulario no será válido sin errores porque está desatado.

Cuestiones relacionadas