2017-06-13 61 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。 –