2017-06-13 57 views
0

我希望让我的用户输入数量的整数值,然后检查输入的数字是否大于可用的总数量。如果它更大,则用户不能下订单,因此会出现验证错误。但是,我遇到了一些麻烦。使用“clean(self)”自动填充Django表单提高ValidationError

既然这样我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 types: int() > NoneType()

如果我看本地变量我看到cleaned_data有以下几点:

{'offering': None, 'quantity': 123456789}

在哪里我错了你知道吗?

回答

0

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

+0

是的,我有'blank = True',因为我在视图中自动填充此字段。我应该删除它吗? – ng150716

+0

不,如果您的应用程序需要在您的模型中管理ForeignKeys,则不应删除此内容。但你需要除了无类型的回应,让你的应用程序处理它们。如果它是None,你可以添加一个条件来将'total_variable_shares'赋值为0。 –