Django - получение правильно отформатированных десятичных дробей в формах (+crispy)?
У меня следующая модель:
class Probe(models.Model):
name = models.CharField("Probe name", max_length=200, blank=True, null=True)
order = models.IntegerField("ordering", default=1)
digits = models.IntegerField("trailing zeroes", null=True, blank=True, default=5)
class ProbeInst(models.Model):
probe = models.ForeignKey(Probe, on_delete=models.CASCADE, null=True, verbose_name="probe")
value = models.DecimalField("Value of probe", max_digits=10, decimal_places=5, null=True, blank=True)
Я пытаюсь отобразить форму ввода с помощью ModelForm и CrispyForms, которая будет отображать необходимое количество нулей в конце поля в соответствии с цифрами..
Однако когда я вижу фактическую форму - я получаю что-то вроде этого...
В принципе, когда я ввожу "2" - я получаю "2.00000", но когда я ввожу "81.4" - я почему-то получаю "81,4"...
Я пробовал переопределить модель формы следующим образом
class ProbeEntryForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if 'instance' in kwargs:
step = 1 / 10 ** kwargs['instance'].probe.digits
super(ProbeEntryForm, self).__init__(*args, **kwargs)
self.fields['value'].decimal_places = kwargs['instance'].probe.digits
self.fields['value'].widget = forms.NumberInput(
attrs={'min': 0, 'placeholder': "Значение", 'step': step, })
self.fields['textvalue'].widget = forms.HiddenInput()
Но после сохранения формы у меня все еще отображаются значения в стиле float, например, "81,4"
Я хочу показать все значения с фиксированным количеством тралирующих нулей - например, "81.40000" и "2.00000
Может кто-нибудь рассказать подробнее?
OK, я нашел решение - добавление deciaml quantize и 'lang':'en' в атрибуты решило проблему!
class ProbeEntryForm(ModelForm):
# Переопределяем форму
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if 'instance' in kwargs:
# Значение теста цифровое?
if kwargs['instance'].probe.probeIsDigital:
# Переопределяем количество десятых в полях ввода
string = '0.' + '0' * kwargs['instance'].probe.digits
step = 1 / 10 ** kwargs['instance'].probe.digits
todigit = Decimal(10) ** -kwargs['instance'].probe.digits
try:
kwargs['instance'].value = (kwargs['instance'].value).quantize(todigit)
except:
print('Не введено значение цифрового теста')
super(ProbeEntryForm, self).__init__(*args, **kwargs)
self.fields['value'].decimal_places = kwargs['instance'].probe.digits
self.fields['value'].widget = forms.NumberInput(
attrs={'min': 0, 'placeholder': "Значение", 'step': step, 'lang':'en' })
self.fields['textvalue'].widget = forms.HiddenInput()
else:
self.fields['value'].widget = forms.HiddenInput()
self.fields['textvalue'].widget = forms.TextInput(attrs={'placeholder': "Текстовое значение"})