Есть ли математика с использованием шаблона шаблона Django? - PullRequest
1 голос
/ 12 июня 2011

В моей базе данных у меня есть целочисленное поле для хранения информации о ценах, например, «10399», «84700». При отображении они должны быть «$ 103,99» и «$ 847,00».

Мне нужно Int * 0,01 для отображения.

Мне было интересно, есть ли способ сделать это, используя шаблонный фильтр Django? Как:

{{ item.price|int_to_float_and_times_0.01 }}

Другой вопрос, на самом деле я выбрал целое число, потому что думал, что это будет более эффективно, чем использование float в базе данных. Это правда?

Ответы [ 4 ]

7 голосов
/ 12 июня 2011

Вы можете создать свой собственный шаблонный фильтр, который по сути делает то, что вам нужно, просто разделив входные данные на 100. Например:

в my_app / templatetags / currency_helper.py:

from django import template
register = template.Library()

@register.filter
def to_currency(value):
    return float(value) / 100.0

Тогда в вашем шаблоне:

{% load currency_helper %}

etc...

{{item.price|to_currency}}

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

0 голосов
/ 12 июня 2011

Вы можете использовать widthratio templatetag для деления:

${% widthratio item.price 100 1 %}

(Результат (a / b) * c, если a, b, c - 3 параметрадля widthratio)

приведет к: $103.99 (для 10399)

0 голосов
/ 12 июня 2011

Я не знаю, можете ли вы вернуть число с плавающей запятой, но вы можете отформатировать число в виде строки:

from django import template
register = template.Library()

def int_to_float_and_times(value):
  value = float(value) * .01
  return u'${0:.2f}'.format(value)

register.filter('int_to_float_and_times', int_to_float_and_times)

Как вы определяете эффективность?Обычно денежные значения хранятся в специальных форматах, которые пытаются выполнять точные вычисления.

edit: 0,01 не допускается в имени функции

0 голосов
/ 12 июня 2011

Вы можете просто изменить целые числа перед передачей их в контекст шаблона, например, с использованием списка:

context['prices'] = [float(item) * 0.01 for item in Model.objects.all()]

(Вы также можете сделать его генератором, убрав скобки, если ваша версия Python поддерживает его, это заставит ваш код использовать меньше памяти.)

Маловероятно, что использование int вместо float сделает ваш сайт заметно быстрее. Если вы хотите безопасный тип для цен, используйте decimal: http://docs.python.org/library/decimal.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...