在使用“clean(self)”提升ValidationError之前自动填充Django表单

时间:2017-06-13 22:24:12

标签: django django-forms

我希望让我的用户输入数量的整数值,然后检查输入的数字是否大于可用的总数量。如果它更大,则用户无法下订单,因此将引发验证错误。但是,我在完成这项工作时遇到了一些麻烦。

现在我的 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}

知道我哪里出错了吗?

1 个答案:

答案 0 :(得分:0)

您无法将整数与无比较。在您的代码中,由于提供的是ForeignKey,因此您要么获取对象,要么为None(因为模型定义中为blank = True)。然后,在您清理的方法中,total_available_shares = cleaned_data.get("offering.current_shares_outstanding")将解析为无,并创建您看到的错误。