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'
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 –