2010-10-06 7 views
10

Ok, sono stato fissando questo per ore cercando di capire cosa sta succedendo, senza alcun risultato. sto cercando di creare un ModelForm usando la parola chiave 'istanza' per passare un'istanza modello esistente e quindi salvarlo. Ecco la ModelForm (spogliato sensibilmente dall'originale nei miei tentativi di identificare la causa di questo problema):Django ModelForm non supera la convalida senza errori

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

e qui è il codice sto correndo:

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

L'oggetto modello (m sopra) è valido e si salva bene, ma la forma non si convalida. Ora, per quanto posso dire, questo codice è identico a quello docs esempio Django trovato qui: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method, anche se ovviamente mi manca qualcosa. Apprezzerei molto gli occhi nuovi per dirmi cosa ho sbagliato.

Grazie

+2

Cosa significa 'f.errors' stampare? – sdolan

risposta

21

Si noti che il vostro link non chiama f.is_valid(), semplicemente salva direttamente. Questo è potenzialmente un po 'fuorviante.

Il punto è che un'istanza di un modulo con solo un parametro instance ma nessuno data non non legano ai dati, e la forma non è quindi valida. Vedrai che f.is_bound è Falso.

Dietro le quinte, instance è proprio come passare i dati initial, che come nota doc viene utilizzato solo per visualizzare i dati inizialmente e non viene utilizzato per il salvataggio. Probabilmente trarrai beneficio dalla lettura dello notes on bound and unbound forms.

+3

+1. "istanza non implicita legata": questo è il ragionamento corretto. –

+0

Grazie, questo ha perfettamente senso. Sapevo che sarebbe stato qualcosa di semplice ... – oogles

+0

Solo per chiarimenti, il motivo per cui stavo usando f.is_valid() era semplicemente quello di rendere la domanda più concisa. L'utilizzo di f.save() fallisce con un attributo errore nel campo clean_data, che non esiste finché il modulo non viene convalidato. Quindi, anche quando stavo usando il codice _exactly_ come nel link che ho postato (usando f.save() invece di f.is_valid()) non funzionava ancora. – oogles

3

Se u ancora voglia di validare l'oggetto che era nel database, è possibile serializzare prima e quindi creare il modulo con esso.

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 

Questo non è probabilmente il modo migliore per farlo, ma l'unico che ho trovato per ottenere una forma legata da un modello. Ne ho bisogno perché voglio convalidare i dati attuali nel database. Creo una domanda in quanto non credo che questo sia il modo migliore di farlo:

Transform an unbound form to a bound one?

+2

mi mancava l'intera cosa "bind data to the form", che è ciò che stai ottenendo con la serializzazione . Credo che Django's django.forms.models.model_to_dict sarebbe meglio di questa serializzazione - vedi la mia risposta alla tua domanda: [link] (http://stackoverflow.com/questions/8993749/transform-an-unbound-form-to -a-bound-one # 8.996.585). – oogles

0

Questa non è una soluzione per la OP, ma è per il titolo del post, che è abbastanza alta in Google. Così vi posterò comunque, da here:

Se sei già dando request.POST al modulo utilizzando request.POST or None, ma è ancora valida senza errori, controllare che non v'è alcuna reindirizzamento succedendo. Un reindirizzamento perde i tuoi dati POST e il tuo modulo non sarà valido senza errori perché non è associato.

Problemi correlati