Умножить в шаблоне django

Я перебираю элементы корзины и хочу умножить количество на удельную цену, как это:

{% for cart_item in cart.cartitem_set.all %}
{{cart_item.quantity}}*{{cart_item.unit_price}}
{% endfor %}

можно ли сделать что-то подобное? любой другой способ сделать это !! Спасибо

4 ответов


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

вы захотите проверить Django документация по тегам шаблона, но быстрый пример:

@register.simple_tag()
def multiply(qty, unit_price, *args, **kwargs):
    # you would need to do any localization of the result here
    return qty * unit_price

который вы можете назвать так:

{% load your_custom_template_tags %}

{% for cart_item in cart.cartitem_set.all %}
    {% multiply cart_item.quantity cart_item.unit_price %}
{% endfor %}

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


можно использовать widthratio встроенный фильтр для умножения и деления.

для вычисления A*B: {% widthratio A 1 B %}

для вычисления A/B: {% widthratio A B 1 %}

источник: ссылке

Примечание: Для иррациональных чисел, результат округляется до целого числа.


или вы можете установить свойство модели:

class CartItem(models.Model):
    cart = models.ForeignKey(Cart)
    item = models.ForeignKey(Supplier)
    quantity = models.IntegerField(default=0)

    @property
    def total_cost(self):
        return self.quantity * self.item.retail_price

    def __unicode__(self):
        return self.item.product_name

Вы можете сделать это в шаблоне с фильтрами.

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters

из документации:

вот пример определения фильтра:

def cut(value, arg):
    """Removes all values of arg from the given string"""
    return value.replace(arg, '')

а вот пример того, как этот фильтр будет использоваться:

{{ somevariable|cut:"0" }}