2010-01-12 14 views
5

Model ondalık alanı bir form seçim alanıyla birleştirmek istiyorum.django, biçimleriyle birleştirir.DecimalField formlarla -> hata: nicelik sonucu, geçerli içerik için çok fazla rakam içeriyor

modelinde alanı:

sum = models.DecimalField(max_digits=2, decimal_places=2) 

formda alanı:

sum = forms.ChoiceField(choices=WORK_HOUR_CHOICES, label='Sum Working Hours', required=True) 

seçimler:

WORK_HOUR_CHOICES = (
    (0, '0'), 
    (0.5, '0.5'), 
    (1, '1'), 
    (1.5, '1.5'), 
    (2, '2'), 
    (2.5, '2.5') 
) 

Ama hep birlikte bir değer saklamak istediğinizde Ondalık bir yer Bu hatayı alıyorum:

quantize result has too many digits for current context 

0 veya 1'i kaydettiğimde, iyi çalışıyor.

Sorun ne?

cevap

6

Sadece bir tahmin, ama orada Decimals koymak gerekir bahis:

WORK_HOUR_CHOICES = (
    (Decimal("0"), '0'), 
    (Decimal("0.5"), '0.5'), 
    (Decimal("1"), '1'), 
    (Decimal("1.5"), '1.5'), 
    (Decimal("2"), '2'), 
    (Decimal("2.5"), '2.5') 
) 

Bir şamandıra sabiteyle Ondalık başlatılamıyor, bir dize kullanmak zorunda.

>>> from decimal import Decimal 
>>> Decimal(1.5) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\software\Python25\lib\decimal.py", line 578, in __new__ 
    "First convert the float to a string") 
TypeError: Cannot convert float to Decimal. First convert the float to a string 
>>> Decimal("1.5") 
Decimal("1.5") 
+1

Teşekkürler, sorun buydu. Denedim ve işe yarıyor. Ayrıca bana doğru yönde işaret ettin ve ondalık desteğe ihtiyacım olmadığı için model alanında Float'a geçtim. Yüzen ile başlangıç ​​ayarı ile çalışır. –

+0

"* Float sabitiyle bir Ondalık başlatamazsınız, bir dize kullanmanız gerekir. *" <- YES. Bu sorun bana baş ağrıyordu! – Gabriel