2012-11-30 17 views
9

Ich führe eine grundlegende Django ModelForm erstellen/validieren/speichern Vorgang. Meine benutzerdefinierten Clean-Methoden werden nicht aufgerufen, wenn is_valid() aufgerufen wird, wenn der Code unter dem Eclipse-Debugger ausgeführt wird, und ich setze einen Haltepunkt nach der Formularerstellung und dem Aufruf von is_valid().Django ModelForm nicht sauber aufrufen

Ich habe den Django-Basiscode zahlreiche Male verfolgt und es scheint, dass das Fehlerwörterbuch der ModelForm-Klasse nie auf None gesetzt ist, was die Validierung auslöst. Ich vermute, dass dies auf eine Interaktion mit dem Debugger zurückzuführen ist, der auf das _errors-Attribut von ModelForm zugreift, um im Variablenfenster angezeigt zu werden.

Wenn ich alle Haltepunkte entferne und den Code auf natürliche Weise fließen lasse, kann ich beweisen, dass der benutzerdefinierte Bereinigungscode ausgeführt wird, indem Druckanweisungen ausgegeben werden.

Ist das ein Fehler im Django ModelForm-Design, ein Eclipse-Problem oder belle ich den falschen Baum?

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 

Mein Test-Harnisch:

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

Versuchen: ff = OrderTestForm (data = Zeile) – Brandon

+0

Danke für den Vorschlag. Ich habe das ohne Veränderung versucht. Ich sollte das Problem ein wenig klären. Wenn ich einen Eclipse-Haltepunkt bei der ModelForm-Erstellung und STEP habe und dann fortsetze, werden die Haltepunkte im Clean nicht ausgelöst. ABER alle Druckanweisungen in den Cleans werden gedruckt, nachdem ich diesen ersten Schritt gemacht habe. Das heißt, ich glaube, wenn Eclipse versucht, auf das ModelForm-Objekt zuzugreifen, um seine Attribute zu lesen, löst es das Clean aus. Dies ist das erwartete Verhalten gemäß den Django-Dokumenten. Es schafft jedoch ein Problem, da das is_valid() nicht richtig funktioniert. –

+0

Können Sie bitte Ihren vollständigen Testfall posten? – Brandon

Antwort

1

Was passiert, wenn Sie versuchen:

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

Ich habe das gleiche Problem wie das OP, und die einzelnen Feldreiniger werden auch nicht aufgerufen. – GreenAsJade

0

Ich habe die "Antwort" gefunden, die eine Art von Nicht-Antwort ist. Der genaue Anwendungsfall war der Empfang einer CSV-Datei von einem Kunden. Nach der Überprüfung der tatsächlichen Datendatei des Kunden wurden die Datenfelder mit Leerzeichen aufgefüllt - viele Leerzeichen. Ich trimmte die Eingabe und schob das getrimmte Wörterbuch in das Formular und alles funktionierte. Erklärt immer noch nicht, warum Eclipse daran erstickt hat.

0

Ich hatte das gleiche Problem und versuchte, ein wenig tiefer zu graben und debuggen das Framework.

Wahrscheinlich gibt es einen Unterschied zwischen regelmäßigen Formen und Modellformen, die dies nicht zur Arbeit verursacht, aber dieser Hack (zwingende is_valid() statt clean(...)) arbeitete für mich:

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

Das Problem ist, dass Sie 'self.cleaned_data []' in dieser Methode nicht berühren können, weil sie noch nicht erstellt wurde. –

Verwandte Themen