Python 使用TypedChoiceField的表单集每~2000次请求不会强制为int

Python 使用TypedChoiceField的表单集每~2000次请求不会强制为int,python,django,django-forms,python-2.6,Python,Django,Django Forms,Python 2.6,我使用的表单集包含多个表单,每个表单都有一个数量字段,定义如下: quantity = TypedChoiceField(coerce=int, required=False) 我想知道是否至少有一个数量>0,因此在我的表单集clean中,我写道: def clean(self): if sum([form.cleaned_data['quantity'] for form in self.forms]) == 0: raise forms.ValidationErro

我使用的表单集包含多个表单,每个表单都有一个数量字段,定义如下:

quantity = TypedChoiceField(coerce=int, required=False)
我想知道是否至少有一个数量>0,因此在我的表单集clean中,我写道:

def clean(self):
    if sum([form.cleaned_data['quantity'] for form in self.forms]) == 0:
        raise forms.ValidationError(_('No products selected'))
所以,通常情况下,这是可行的,form.cleaned_data['quantity']是一个int(由强制=int设置)。但每隔一段时间(比如每2000次申请此表单),我就会收到一个异常,它告诉我:

TypeError: unsupported operand type(s) for +: 'int' and 'str'
在这一行,这意味着form.cleaned_data['quantity']是一个字符串,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'
>>> 
异常类型:在
/**/url
异常值:不支持+:'int'和'str'的操作数类型 根据,TypedChoiceField的默认
空\u值是空字符串,该值不受强制

我认为有时很可能会得到一个空值,而抛出TypeError的字符串就是空字符串。尝试:

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

这个问题听起来相当本地化,但我会在您的实时代码中捕获特定的异常,并在断点周围记录表单变量,然后等待它再次发生,这样您至少可以调试一些东西。顺便说一句,Sentry是一个很好的自动化工具,Goodluck这很奇怪,因为我在Sentry中有一个异常跟踪,它也保存了帖子内容,并且数量值包含u'1'。这显然不是一个空值。我能看看那个跟踪吗?我在帖子中添加了一个stacktrace:)在那个例子中,你确定所有的数量都是非空的吗?无论如何,您肯定要添加
空值
参数,这样您的强制是一致的。
quantity = TypedChoiceField(coerce=int, required=False, empty_value=0)