Sakeer
Sakeer

Reputation: 2006

multiplication in django template without using manually created template tag

I want to achieve multiplication operation in django template. For example I have the values, price=10.50 quantity=3

With the help of this link

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

I tried below codes for achieving it,

{% widthratio quantity 1 price %}

but it's returning only 31. But I need the answer in float (31.5)

And I want to achieve it without using the manually created tags

How can I achieve it? Thanks in advance...

Upvotes: 31

Views: 54729

Answers (5)

Abdul Khaliq
Abdul Khaliq

Reputation: 2285

Multiplication with variable in Django.

1st: install & then register "mathfilters" at INSTALLED_APPS in setting.py 
2nd: Add {% load mathfilters %} in html Page 
3rd: Multiply with variable like{{response.notSatisfied|mul:100}}

Upvotes: 1

Mai Elshiashi
Mai Elshiashi

Reputation: 371

I know it's been so long since this question came out but, now there's a library called django-mathfilters which made mathematical operations easier in Django templates. you can easily write <li>42 * 0.5 = {{ answer|mul:0.5 }}</li> for multiplication.

check it out https://pypi.org/project/django-mathfilters/

Upvotes: 5

Mathieu Marques
Mathieu Marques

Reputation: 1748

There are 2 approaches:

  • Computing the values inside the view and pass them to the template (recommended in my opinion)
  • Using template filters

In the manner of the add filter, you could always create your own multiply filter, creating your own custom filter:

from django import template

register = template.Library()

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

Then in your template, something like that should work.

{{ quantity | multiply:price }}

This is not tested, and I never did this as - again - I find neater to compute datas inside the views and render only with the templates.

Upvotes: 35

WahhabB
WahhabB

Reputation: 520

Another approach that I have used seems cleaner to me. If you are going through a queryset, it doesn't make sense to compute the values in your view. Instead, add the calculation as a function in your model!

Let's say your model looks like this:

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

Simply add the following to the model:

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

Now you can simply treat line_total as if it were a field in the record:

{{ line_item.line_total }}

This allows the line_total value to be used anywhere, either in templates or views, and ensures that it is always consistent, without taking up space in the database.

Upvotes: 10

hahakubile
hahakubile

Reputation: 7552

You can use the built-in widthratio template tag.

  • a*b use {% widthratio a 1 b %}
  • a/b use {% widthratio a b 1 %}

Note: the results are rounded to an integer before returning.

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

Upvotes: 87

Related Questions