#python #django #django-models #decimal #scientific-notation
#python #django #django-модели #десятичная #научная нотация
Вопрос:
Я хочу, чтобы пользователи могли вводить стандартное десятичное значение, например 1.51, или вводить значение в научной нотации, например 4.08E 13.
Я настроил десятичное поле в своей модели, но когда я пытаюсь ввести приведенный выше пример, я получаю это сообщение о проверке:
«Убедитесь, что в нем не более 3 знаков после запятой».
Примечание сбоку:
Я заметил, что Python уже поддерживает этот формат:
>>> from decimal import Decimal
>>> print Decimal("4.08E 13")
4.08E 13
Так что, может быть, будет не слишком сложно настроить что-то в Django?
Комментарии:
1. Вы намеренно избегали чтения этого: docs.djangoproject.com/en/1.3/ref/models/fields /… ?
2. 4.08E 13 содержит два знака после запятой, я разрешаю до трех. Вы намеренно избегали чтения моего вопроса!
3. В 4.08E 13 нет никаких знаков после запятой. Однако в нем есть 14 цифр.
4. @Greg — поправьте меня, если я ошибаюсь, но разве эта ссылка, предоставленная С. Лоттом, напрямую не ведет вас к тому, как настроить Django так, чтобы в нем допускалось X десятичных разрядов и максимальное количество цифр?
5. Я следовал этим инструкциям. Я перепробовал всевозможные значения decimal_places и max_digit. Если я увеличиваю их действительно высоко, кажется, что они принимают значение, но затем выдает мне эту ошибку: «результат квантования содержит слишком много цифр для текущего контекста»
Ответ №1:
Это похоже на ошибку Django, DecimalField.validate() неверен для положительных показателей:
>>> from django.forms import DecimalField
>>> f = DecimalField(max_digits=10, decimal_places=1)
>>> f.validate(Decimal('1E 2'))
Traceback (most recent call last):
...
ValidationError: [u'Ensure that there are no more than 1 decimal places.']
Возможно, вы захотите сообщить об ошибке.
Комментарии:
1. Спасибо. Тем временем, я думаю, мне следует написать свое собственное поле модели?
2. Вот и все, что нужно для сообщения об ошибке. Я получил сообщение «Отправка отклонена как потенциальный спам (BlogSpam сообщает, что контент является спамом (badip: state / blacklist.d / 127.0.0.1))»
3. Если вы напишете хороший патч (включая тестовый набор!) и четкий отчет об ошибке, возможно, вам повезет, и вы быстро исправите его. Однако, если вы не хотите использовать trunk или не можете ждать, я бы рекомендовал создать подкласс DecimalField и перезаписать validate() .
4. Вам придется зарегистрироваться, чтобы обойти фильтр нежелательной почты.
5. Вопрос о подклассах. Я хочу переопределить модели. DecimalField но единственный класс DecimalField, который я вижу, находится в forms/fields.py. Это действительно то, чего я хочу?