2012-11-30 20 views
9

Sto eseguendo un Django ModelForm di base per creare/validare/salvare l'operazione. I miei metodi clean personalizzati non vengono chiamati quando viene chiamato is_valid() durante l'esecuzione del codice sotto il debugger Eclipse e imposto un breakpoint dopo la creazione del modulo e la chiamata a is_valid().Django ModelForm not calling clean

Ho rintracciato il codice base Django numerose volte e sembra che il dizionario degli errori sulla classe ModelForm non sia mai impostato su Nessuno, che attiva la convalida. Sospetto che ciò sia dovuto a un'interazione con il debugger che accede all'attributo _errors di ModelForm da visualizzare nel riquadro delle variabili.

Quando rimuovo tutti i punti di interruzione e faccio scorrere il codice in modo naturale, posso provare che il codice pulito personalizzato è in esecuzione emettendo dichiarazioni di stampa.

È un difetto nel design ModelForm di Django, un problema di Eclipse o sto abbaiando dall'albero sbagliato?

models.py

from django.db import models 

class TestModel1(models.Model): 
    field1 = models.CharField(max_length=45) 
    field2 = models.IntegerField(default=2) 
    field3 = models.CharField(max_length=45, null=True, blank=True) 

forms.py

from order.models import TestModel1 
from django.forms import ModelForm 

class OrderTestForm(ModelForm): 

    def clean_field1(self): 
     return self.cleaned_data['field1'] 

    def clean_field2(self): 
     return self.cleaned_data['field2'] 

    class Meta: 
     model = TestModel1 

mio test harness:

from forms import OrderTestForm 

row = {'field1': 'test value', 'field2': '4', } 

ff = OrderTestForm(row) 

#ff.full_clean() 
if ff.is_valid(): 
    ff.save() 
else: 
    print ff.errors 
+0

Prova: FF = OrderTestForm (data = fila) – Brandon

+0

Grazie per il suggerimento. L'ho provato senza modifiche. Dovrei chiarire un po 'il problema. Se ho un breakpoint di Eclipse sulla creazione ModelForm e su STEP e quindi riprendo, i punti di interruzione in clean non vengono attivati. MA qualsiasi affermazione di stampa nelle pulizie viene stampata dopo aver fatto il primo passo. Ciò significa, credo, che quando Eclipse tenta di accedere all'oggetto ModelForm per leggerne gli attributi, attiva il clean. Questo è il comportamento previsto secondo i documenti di Django. Crea un problema, tuttavia, poiché is_valid() non funziona correttamente. –

+0

Potete per favore pubblicare il vostro caso di test completo? – Brandon

risposta

1

Che cosa succede se si prova:

from order.models import TestModel1 
from django.forms import ModelForm 

class OrderTestForm(ModelForm): 
    class Meta: 
     model = TestModel1 

    def clean_field1(self): 
     value = self.cleaned_data['field1'] 
     print value 
     return value 

    def clean_field2(self): 
     value = self.cleaned_data['field2'] 
     print value 
     return value 
+0

Ho lo stesso problema dell'OP e neanche i singoli pulitori di campo vengono chiamati. – GreenAsJade

0

Ho trovato la "risposta" che è una specie di non risposta. Il caso d'uso esatto stava ricevendo un file CSV da un cliente. Dopo l'ispezione del file di dati effettivo del cliente, i campi di dati sono stati riempiti con spazi: molti spazi. Ho tagliato l'input e ho spinto quel dizionario tagliato nella forma e tutto ha funzionato. Ancora non spiega perché eclissi soffocato su questo.

0

Ho avuto lo stesso problema e ho provato a scavare un po 'più a fondo e fare il debug del framework.

C'è probabilmente una differenza tra le forme regolari e le forme modello che causa questo non lavorare, ma questo hack (ignorando is_valid() invece di clean(...)) ha lavorato per me:

def is_valid(self): 
    #run whatever ModelForm validations you need 
    return super(OrderTestForm, self).is_valid() 
+0

Il problema è che non puoi toccare 'self.cleaned_data []' in quel metodo perché non è ancora stato creato. –

Problemi correlati