2012-01-24 2 views
5

Voglio avere un modulo associato da un oggetto per utilizzare il metodo is_valid. Il motivo è perché ho alcuni vecchi dati che voglio che gli utenti correggano in base alle nuove regole di validazione. Quindi, voglio riutilizzare il codice dei metodi puliti nella mia forma.Trasforma un modulo non legato in uno vincolato?

Ho finito serializzazione mia risposta:

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 funziona, ma non sembra molto Djangish. Inoltre, sembra un problema comune, quindi stavo cercando un modo migliore per farlo.

Secondo la documentazione tradurre i dati da non legato a non legato non è destinato ad accadere: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method tuttavia, che sarebbe la soluzione più semplice per me.

+0

Dimmi se ho capito bene: Hai vecchi dati in qualche luogo e dal momento che questo è stato salvato, le regole di convalida cambiati. Ora vuoi usare un ModelForm per riconvalidare i vecchi dati e visualizzare gli errori all'utente? – Martin

+0

Da dove proviene 'obj'? Questo aiuterà a determinare cosa sta succedendo qui. –

+0

Esattamente @Penthi. Penso che Oogles mi abbia dato quello che sto cercando. Grazie –

risposta

11

C'è la funzione django.forms.models.model_to_dict di Django che convertirà l'istanza del modello esistente in un dizionario di dati adatto per il binding a un ModelForm.

Questo sarebbe probabilmente più efficiente e decisamente più "Djangish", piuttosto che serializzare e non serializzare l'oggetto.

E se si crea anche il modulo con la parola chiave instance, saprà aggiornare il record esistente quando viene salvato.

Quindi:

from django.forms.models import model_to_dict 

... 

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

Grazie! Questo è quello che stavo cercando. –