0

我正在面對django的一個奇怪問題。看來,當我在formset上運行is_valid()時,每個子窗體的一個值設置爲None。爲了檢查這一點,我把兩條調試行打印出了清潔數據字典。一個在clean_qty()的末尾,另一個在is_valid()之後。Django在驗證表單時意外地將字段設置爲None

下面的形式:

class ProductsForm(forms.Form): 
    product_ref  = forms.CharField(max_length=6, widget=forms.HiddenInput) 
    product_name = forms.CharField(max_length=200, widget=forms.HiddenInput) 
    unit   = forms.CharField(max_length=16, widget=forms.HiddenInput) 
    qty    = forms.DecimalField(max_digits=6, decimal_places=3, 
         widget=forms.TextInput(attrs={'size': 5})) 

    def clean_qty(self): 
     data = self.cleaned_data 

     if data['qty'] < 0: 
      raise ValidationError('La quantité doit être positive') 

     unit = Unit.objects.get(pk=data['unit']) 

     if not unit.accept_dec and '.' in str(data['qty']) \ 
     and int(str(data['qty']).split('.')[1]) != 0: 
      raise ValidationError('La quantité doit être entière') 

     print "!!!" + str(data) + "!!!" 

ProductsFormSet = formsets.formset_factory(ProductsForm, extra=0, 
    can_delete=True) 

這裏是視圖的開頭:

def cart(request): 
    if request.method == 'POST': 
     products_formset = ProductsFormSet(request.POST, prefix='products') 
     cart_form = CartForm(request.POST, prefix='cart') 
     if products_formset.is_valid() and cart_form.is_valid(): 
      ''' 
       Create and save the cart 
       Send a confirmation email 
      ''' 

      for form in products_formset: 
       print "???" + str(form.cleaned_data) + "???" 

而結果,當我提出我的表格:

DEBUG:django.db.backends:(0.000) SELECT `catalog_unit`.`value`, `catalog_unit`.`plural_val`, `catalog_unit`.`accept_dec` FROM `catalog_unit` WHERE `catalog_unit`.`value` = 'Truc' ; args=(u'Truc',) 
!!!{'product_ref': u'BDL233', 'product_name': u'Bidule', 'unit': u'Truc', 'qty': Decimal('2.2')}!!! 
DEBUG:django.db.backends:(0.001) SELECT `catalog_unit`.`value`, `catalog_unit`.`plural_val`, `catalog_unit`.`accept_dec` FROM `catalog_unit` WHERE `catalog_unit`.`value` = 'Truc' ; args=(u'Truc',) 
!!!{'product_ref': u'MCH024', 'product_name': u'Machin', 'unit': u'Truc', 'qty': Decimal('1.3')}!!! 
DEBUG:django.db.backends:(0.000) SELECT `catalog_unit`.`value`, `catalog_unit`.`plural_val`, `catalog_unit`.`accept_dec` FROM `catalog_unit` WHERE `catalog_unit`.`value` = 'Chacal' ; args=(u'Chacal',) 
!!!{'product_ref': u'CHO127', 'product_name': u'Chouette', 'unit': u'Chacal', 'qty': Decimal('3')}!!! 
???{'DELETE': False, 'product_ref': u'BDL233', 'product_name': u'Bidule', 'unit': u'Truc', 'qty': None}??? 
???{'DELETE': False, 'product_ref': u'MCH024', 'product_name': u'Machin', 'unit': u'Truc', 'qty': None}??? 
???{'DELETE': False, 'product_ref': u'CHO127', 'product_name': u'Chouette', 'unit': u'Chacal', 'qty': None}??? 

正如你可以看到,唯一的區別是qty被設置爲None。

我不知道這個行爲可以從哪裏來。

在此先感謝您的光。

+0

您不從清潔中返回數據 - 請參閱文檔 - https://docs.djangoproject.com/zh-CN/dev/ref/forms/validation/#cleaning-a-specific-field-attribute - 始終返回數據 – JamesO 2012-07-31 08:26:29

回答

2

全部clean_FIELD方法必須返回被驗證的值。所以你的clean_qty方法應該有return data['qty']

+0

哦,對我感到羞恥。謝謝 – 2012-07-31 08:29:28