django에 이상한 문제가 있습니다. 그것은 formset에 is_valid()를 실행하면 각 하위 폼의 한 값이 None으로 설정되는 것으로 보입니다. 이를 확인하기 위해 cleaned_data dict를 출력하는 두 개의 디버그 라인을 넣었습니다. 하나는 cleaned_qty() 끝에 있고 다른 하나는 is_valid() 뒤에옵니다. 여기 장고는 예기치 않게 formset의 유효성을 검사 할 때 필드를 없음으로 설정합니다.
의 형식은 다음과 같습니다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으로 설정된다는 것입니다.
이 동작의 출처를 전혀 알 수 없습니다.
미리 감사드립니다.
깨끗한 상태에서 데이터를 반환하지 않는 경우 - docs - https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute - 항상 데이터를 반환하십시오. – JamesO