Умножение в шаблоне django без использования созданного вручную тега шаблона

Я хочу получить операцию умножения в шаблоне django. Например У меня есть значения,   цена = 10,50   количество = 3

С помощью этой ссылки

http://slacy.com/blog/2010/07/using-djangos-widthratio-template-tag-for-multiplication-division/

Я попробовал ниже коды для его достижения,

{% widthratio quantity 1 price %}

но его возвращение только 31. Но мне нужен ответ в float (31.5)

И я хочу достичь этого без использования созданных вручную тегов

Как я могу это достичь? Спасибо заранее...

Ответ 1

Вы можете использовать встроенный тег шаблона widthratio.

  • a * b использовать {% widthratio a 1 b %}
  • a/b use {% widthratio a b 1 %}

Примечание. Перед возвратом результаты округляются до целого числа.

@see https://docs.djangoproject.com/en/dev/ref/templates/builtins/

Ответ 2

Есть 2 подхода:

  • Вычисление значений внутри представления и передача их в шаблон (рекомендуется на мой взгляд)
  • Использование шаблонных фильтров

add фильтру add, вы всегда можете создать свой собственный фильтр multiply, создав собственный настраиваемый фильтр:

from django import template

register = template.Library()

@register.filter
def multiply(value, arg):
    return value * arg

Тогда в вашем шаблоне что-то подобное должно работать.

{{ quantity | multiply:price }}

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

Ответ 3

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

Скажем, ваша модель выглядит так:

Class LineItem:
    product = models.ForeignKey(Product)
    quantity = models.IntegerField()
    price = models.DecimalField(decimal_places=2)

Просто добавьте к модели следующее:

    def line_total(self):
        return self.quantity * self.price

Теперь вы можете просто обрабатывать line_total, как если бы это было поле в записи:

{{ line_item.line_total }}

Это позволяет использовать значение line_total в любом месте, будь то в шаблонах или представлениях, и гарантирует, что он всегда согласован, не занимая места в базе данных.