2013-03-15 3 views
5

ich ein FormSet bin mit, dass mehrere Formulare enthält, die jeweils ein Mengenfeld haben, die wie folgt definiert ist:FormSet mit TypedChoiceField nicht einmal in int gezwungen ~ 2000 Anfragen

quantity = TypedChoiceField(coerce=int, required=False) 

ich, ob wissen wollen bei mindestens eine Menge> 0, so in meinem formset ist sauber, ich schreibe dies:

def clean(self): 
    if sum([form.cleaned_data['quantity'] for form in self.forms]) == 0: 
     raise forms.ValidationError(_('No products selected')) 

also, normalerweise dies nur funktioniert, und form.cleaned_data [ 'Menge'] ist ein int (wie durch coerce = int gesetzt) . Aber jeder einmal in eine Weile (wie einmal alle 2000 Anfragen für diese Form), i eine Ausnahme erhalten, die mir sagt:

TypeError: unsupported operand type(s) for +: 'int' and 'str' 

Auf dieser Linie, die die form.cleaned_data bedeutet [ ‚Menge‘] ist ein String und sum() mag das Summieren von Zeichenfolgen nicht, daher wird eine Ausnahme ausgelöst. Sie können dies selbst testen, indem Sie die Python-Konsole starten und folgendes eingeben:

Also meine Frage ist, warum passiert das? Und warum passiert das so selten? Die django-Dokumentation sagt mir, dass das Drücken des TypeChoiceFields garantiert erfolgt, bevor clean() aufgerufen wird, also sollte dies nicht passieren.

Der Fehler ist schwer zu beheben, weil es so schwer ist, zu reproduzieren, so dass ich hoffe einer von euch ein ähnliches Problem wie dieses hatte.

Dies ist auf Python 2.6 und 1.3.1 django.

Vielen Dank im Voraus!

EDIT So, hier ist die Stacktrace:

File "****/handlers/products.py" in process 
    429.    if formset.is_valid(): 
File "/usr/local/lib/python2.6/dist-packages/django/forms/formsets.py" in is_valid 
    263.  err = self.errors 
File "/usr/local/lib/python2.6/dist-packages/django/forms/formsets.py" in _get_errors 
    241.   self.full_clean() 
File "/usr/local/lib/python2.6/dist-packages/django/forms/formsets.py" in full_clean 
    287.   self.clean() 
File "****/handlers/products.py" in clean 
    217.  if sum([form.cleaned_data['quantity'] for form in self.forms]) == 0: 

Ausnahmetyp: Typeerror bei /****/url Exception Wert: nicht unterstützte Operandtyp (e) für +: 'int' und 'str'

+0

Dieses Problem eher lokalisierte klingt, aber ich würde beginnen die spezifische Ausnahme in der Live-Code zu kontrollieren und melden Sie die Formularvariablen Einheimischen um diesen Haltepunkt, dann nur warten, bis es wieder geschehen, so dass Sie zumindest etwas zu debuggen. Btw Sentry ist ein nettes Tool, dies zu automatisieren, goodluck –

Antwort

1

der Standard empty_value für ein TypedChoiceField ist die leere Zeichenfolge nach the docs, und dieser Wert ist nicht dazu gezwungen.

Ich denke, es ist sehr wahrscheinlich, dass Sie einen leeren Wert gelegentlich fühlt, und die Zeichenfolge, die Ihre Typeerror werfen ist die leere Zeichenkette. Versuchen:

quantity = TypedChoiceField(coerce=int, required=False, empty_value=0) 
+0

dass, obwohl seltsam, weil ich eine Ausnahme Spur in Sentry haben, die auch die Pfosten Inhalte gespeichert, und die Menge enthaltene Wert U'1' . Das ist natürlich kein leerer Wert. – jaapz

+0

Könnte ich mir diese Spur ansehen? – Hamms

+0

Ich habe einen Stacktrace auf die Post :) – jaapz