Лучшая практика Django для округления десятичных дробей: фронтенд или бэкэнд? - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть довольно обширный сайт Django, который имеет дело с денежными суммами, которые должны отображаться с двумя десятичными разрядами, но, поскольку над этими суммами выполняются математические операции, используются 4-значные десятичные знаки. Некоторые страницы получают эти суммы с помощью вызовов AJAX (как JSON), а другие страницы получают их с помощью стандартной передачи переменной шаблона view =>. Мои модели используют models.DecimalField(max_digits=10, decimal_places=4, default=Decimal('0'))

Теперь сайт достаточно большой, поэтому мне нужно найти непротиворечивый способ справиться с этим десятичным округлением, но независимо от того, каким образом я это делаю, это кажется неловким. Вот два способа, которыми я могу придумать, но каждый из них кажется не идеальным.

  1. Внешний интерфейс: представления оставляют десятичные знаки без изменений, с 4-мя знаками. Шаблоны используют фильтр floatformat:2, а функции JS - .toFixed(2) для преобразования входящих данных JSON. Проблема: нужно обрабатывать округление во многих местах в коде шаблона и JS-код.

  2. Backend: просматривает все десятичные дроби до 2 разрядов и передает их в виде строк в шаблоны. Аналогично, ответы на входящие вызовы AJAX сериализуют все десятичные дроби в 2 знака . Проблема: представления теперь обрабатывают форматирование вместо шаблонов, и особые случаи не могут быть отформатированы по-другому в шаблоне.

Есть ли "правильный, Djangonic" способ обработки десятичного округления?

1 Ответ

1 голос
/ 23 ноября 2011

Учитывая, что это чисто вопрос презентации, мой инстинкт был бы держать его в шаблонах.Тем не менее, шаблоны должны быть настолько глупыми, насколько это возможно, и вы, вероятно, не захотите жестко кодировать ваши десятичные разряды в виде магических чисел во всех ваших шаблонах.

Я бы, наверное, сделалчто-то вроде следующего:

  • Не обрабатывайте никакие десятичные разряды в своих представлениях, если это не является частью вашей логики вычислений.
  • Создайте собственный фильтр шаблона, который форматирует ваши плавающие числадля параметров, определенных в вашем settings.py
  • Напишите пользовательскую функцию JavaScript, которая делает то же самое
  • Используйте ваш новый фильтр и функцию для манипулирования десятичными числами, как они появляются в шаблонах и обратных вызовах AJAX.

Таким образом, вы сохраняете всю логику представления на уровне шаблона, но при этом сохраняете принципы СУХОЙ.Это по-прежнему требует большого количества изменений в ваших шаблонах и JavaScript, но я не могу придумать более чистого способа сделать это, не попав на действительно хакерскую территорию.

...