をintに強制的ではない私は、それぞれがこのように定義された数量のフィールドを持っているいくつかの形式が含まれているフォームセットを使用しています:フォームセットTypedChoiceFieldを使用して一回〜2000の要求
quantity = TypedChoiceField(coerce=int, required=False)
私がいるかどうかを知りたいです少なくとも1つの量> 0、私のフォームセットのクリーンで、私はこの書き込みをして:だから
def clean(self):
if sum([form.cleaned_data['quantity'] for form in self.forms]) == 0:
raise forms.ValidationError(_('No products selected'))
を、通常、これは単に動作し、form.cleaned_data [「量」]は(強制= int型で設定された)intです。しかし、たまにで(このフォームのように一度2000のリクエスト)、私は私に語った例外を取得:その行に
TypeError: unsupported operand type(s) for +: 'int' and 'str'
、form.cleaned_data [「量」]を意味する文字列です、sum()は文字列の合計が好きではないので、例外がスローされます。 Pythonコンソールを起動し、次のように入力して、これを自分でテストすることができます。
>>> sum([u'1', u'2'])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'unicode'
>>>
私の質問は、どうしてですか?そして、なぜこれはまれに起こるのでしょうか? djangoのドキュメントでは、TypedChoiceFieldの強制がclean()が呼び出される前に行われることが保証されているので、これは起こりません。
このバグは再現するのが難しいので修正するのが難しいので、皆さんのうちの一人がこれに似た問題を抱えていることを願っています。
これはpython 2.6とdjango 1.3.1です。
ありがとうございます!だからここ
EDIT は、スタックトレースです:
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:
例外の種類:+のためのサポートされていないオペランドのタイプ(S): 'int型' と 'str' は
この問題ではなく、ローカライズに聞こえるが、私はあなたのライブのコード内の特定の例外をキャッチ起動し、そのブレークポイントの周りにフォーム変数の地元の人々を記録し、あなたは少なくとも持っているので、それが再び起こることのために、次に待つだけだろうデバッグするものBtw Sentryはこれを自動化する素晴らしいツールです。goodluck –