我希望让我的用户输入数量的整数值,然后检查输入的数字是否大于可用的总数量。如果它更大,则用户无法下订单,因此将引发验证错误。但是,我在完成这项工作时遇到了一些麻烦。
现在我的 models.py 看起来像这样:
class DirectInvestment(models.Model):
offering = models.ForeignKey('company.DirectOffering', blank=True)
quantity = models.IntegerField()
总共享计数来自offering.current_shares_outstanding
(因为它是外键)。
此外,我的 forms.py 如下所示:
class DirectInvestmentForm(forms.ModelForm):
class Meta:
model = DirectInvestment
fields = ('offering', 'quantity')
def clean(self):
cleaned_data = super(DirectInvestmentForm, self).clean()
print(cleaned_data)
quantity = cleaned_data.get("quantity")
total_available_shares = cleaned_data.get("offering.current_shares_outstanding")
if quantity > total_available_shares:
raise forms.ValidationError("Quantity exceeds total shares available")
最后,这是 views.py :
的相关内容form = DirectInvestmentForm(request.POST or None)
form.fields['offering'].widget = forms.HiddenInput()
if form.is_valid():
investment = form.save(commit=False)
offering = DirectOffering.objects.get(id=offering_id) # offering_id I get from the URL
investment.offering = offering
investment.save()
return HttpResponseRedirect('/investments')
context_dict['form'] = form
当我朗读代码并提交表单时,我收到错误:
unorderable类型:int()> NoneType()
如果我查看Local vars,我会看到cleaning_data具有以下内容:
{'offering': None, 'quantity': 123456789}
知道我哪里出错了吗?
答案 0 :(得分:0)
您无法将整数与无比较。在您的代码中,由于提供的是ForeignKey,因此您要么获取对象,要么为None(因为模型定义中为blank = True
)。然后,在您清理的方法中,total_available_shares = cleaned_data.get("offering.current_shares_outstanding")
将解析为无,并创建您看到的错误。