Най-добра практика на Django за закръгляване на десетични знаци: интерфейс или бекенд?

Имам доста обширен сайт на Django, който се занимава с валутни суми, които трябва да бъдат показани с 2 знака след десетичната запетая, но тъй като върху тези суми се извършват математически операции, зад кулисите се използват 4 знака след десетичната запетая. Някои страници получават тези суми чрез AJAX извиквания (като JSON), а други страници ги получават чрез стандартен изглед => предаване на променлива на шаблон. Моите модели използват models.DecimalField(max_digits=10, decimal_places=4, default=Decimal('0'))

Сайтът е достатъчно голям сега, че трябва да измисля последователен начин да се справя с това десетично закръгляване, но без значение по какъв начин го правя, изглежда неудобно. Ето двата начина, за които се сещам, но всеки не изглежда толкова идеален.

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

  2. Backend: изгледи закръглят всички десетични знаци до 2 места и ги предават като низове към шаблоните. По същия начин отговорите на входящи AJAX извиквания сериализират всички десетични знаци до 2 места. Проблем: изгледите вече обработват форматиране вместо шаблони и специални случаи не могат да бъдат форматирани по различен начин в шаблона.

Има ли "правилен, Djangonic" начин за обработка на десетично закръгляване?


person Cloud Artisans    schedule 22.11.2011    source източник
comment
Не мисля, че има окончателен отговор на въпроса ви, но се опитвам да запазя шаблоните възможно най-глупави, така че бих направил форматирането от страна на сървъра.   -  person Brandon    schedule 23.11.2011


Отговори (1)


Като се има предвид, че това е чисто презентационен проблем, инстинктът ми би бил да го запазя в шаблоните. Въпреки това, шаблоните трябва да са възможно най-глупави и вероятно не искате да кодирате твърдо вашия десетичен знак, който се брои като магически числа във вашите шаблони.

Вероятно бих направил нещо като следното:

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

По този начин запазвате цялата си презентационна логика на ниво шаблон, но все още поддържате СУХИТЕ принципи. Това все още означава много редакции на вашите шаблони и JavaScript, но наистина не мога да измисля по-чист начин да го направя, без да навлизам в наистина хакерска територия.

person Evan Brumley    schedule 23.11.2011