2013-03-15 4 views
5

を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' は

+0

この問題ではなく、ローカライズに聞こえるが、私はあなたのライブのコード内の特定の例外をキャッチ起動し、そのブレークポイントの周りにフォーム変数の地元の人々を記録し、あなたは少なくとも持っているので、それが再び起こることのために、次に待つだけだろうデバッグするものBtw Sentryはこれを自動化する素晴らしいツールです。goodluck –

答えて

1
/****/url 例外値ではTypeError

TypedChoiceFieldのデフォルトのempty_valueは、the docsに従って空の文字列であり、その値は強制されません。

私は機会に空の値を得ている可能性が非常に高いと思います。あなたのTypeErrorを投げている文字列は空の文字列です。試してみてください:

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

SentryにExceptionトレースがあり、Postコンテンツも保存されていて、量値にu'1 'が含まれているので、それは変です。明らかに空の値ではありません。 – jaapz

+0

そのトレースを見ることができますか? – Hamms

+0

投稿にstacktraceを追加しました:) – jaapz

関連する問題